多个Biztalk主机实例写入单个文件

时间:2013-08-05 10:53:18

标签: file biztalk

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

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

3 个答案:

答案 0 :(得分:3)

  

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

     

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

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

但是,我认为你的方法是错误的。您不能指望四个独立且完全断开的进程(不超过4个服务器)可靠地附加到单个文件 - IN ORDER。

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

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

答案 1 :(得分:1)

如果FIFO很重要,BizTalk已经订购了传送机制(支持FILE适配器),但它的性能成本却很高。

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

答案 2 :(得分:0)

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