1

我们在生产环境中有四个 Biztalk 服务器。发送端口配置为将传入消息写入一个文本文件。该端口一天接收数千条消息。因此,多个主机实例尝试一次写入文件,在一个实例完成写入完整记录之前,另一个实例开始写入新记录,导致数据分散在整个文件中。

我们能做些什么来解决这个问题?

4

3 回答 3

3

...在一个实例完成写入完整记录之前,另一个实例开始写入新记录,导致数据分散在整个文件中。

我们能做些什么来解决这个问题?

简单的方法是仅使用单个主机实例将数据写入文件,但是您可能会开始遇到限制问题。或者,您可以探索使用文件适配器上的“允许写入时缓存”选项,这可能会提供一些改进。

但是,我认为您的方法是错误的。您不能指望四个独立且完全断开连接的进程(至少跨 4 个服务器)可靠地附加到单个文件 - 按顺序。

因此,我认为您应该重新设计此解决方案:

  1. 收到每条消息后,将消息的内容写入带有“未处理”标志的数据库表(简单的 INSERT)。您可以可靠地让四个主机实例将数据发送到 SQL 中,而不必担心它们会相互绊倒。
  2. 在预定的时间,让 BizTalk 提取该 SQL 表中标记为未处理的所有记录(WCF-SQL 适配器可以在此处为您提供帮助)。轮询记录后,将它们标记为“处理中”。
  3. 您现在应该有一条消息,其中包含所有当前未处理的记录(从 SQL 中检索)。使用单个(或多个)主机实例,将消息写入磁盘,在一次写入中将每个记录附加到文件中。这里的关键是您只向一个文件写入一条消息,而不是很多很多:-)
  4. 如果写入成功,则使用“已处理”标志更新 SQL 表中的每条记录,以便在下一次轮询时不会再次拾取它们。

您可能需要考虑对这部分进行单例编排,以确保同时只发生一个 poll-write-update 过程。

于 2013-08-08T13:04:07.757 回答
1

如果 FIFO 很重要,BizTalk 具有有序的传递机制(支持 FILE 适配器),但它是以性能为代价的。

更好的解决方案是让实例写入单个文件,然后让另一个计划进程(或编排)将它们组合到一个文件中。您可以使用时间戳强制执行 FIFO。与前面提到的单例编排相比,这将提供更好的性能和资源利用率。其他选项可能是使用任何合适的队列实现。

于 2013-08-11T17:52:02.503 回答
0

您可以移动到数据库系统而不是文件。那将是非常简单的解决方案,也非常有效。如果您不想那样做,则必须在应用程序内部实现文件锁定或信号量,以便新线程将等待其他线程完成写入。

于 2013-08-05T10:56:57.107 回答