【问题标题】:Multiple Biztalk host instances writing to single file多个 Biztalk 主机实例写入单个文件
【发布时间】:2013-08-12 01:52:02
【问题描述】:

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

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

【问题讨论】:

  • 两个快速问题 - 1. 为什么需要写入单个文件?你的业务流程是什么? 2. 如果消息 A 写入磁盘,然后消息 B 立即写入磁盘(覆盖消息 A 的内容),这样可以接受吗?
  • 这些是个人记录。我们将一天内收到的所有记录放在一个文件中。消息 A 被消息 B 覆盖是不可接受的,因为这可能导致数据丢失。现在,在 A 的记录结束之前,消息 B 开始写入。我看到许多站点提到使用 Biztalk 主机集群来防止 FTP 适配器的数据重复。但我正在使用文件适配器。

标签: file biztalk


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 感谢您的回复。但是 sendport 正在使用 FileAdapter 写入该文件。我们不能使用数据库。在 EOD,该文件被备份并 ftp 到另一个位置。使用 Sempaphore 您的意思是编写自定义适配器?
      • 这很可能是实现您想做的事情所必需的。
      • 谢谢 Puciek ..我只是想确认一下...是说编写自定义适配器是实现这一目标的唯一选择吗?默认情况下,文件适配器不锁定文本文件。
      • 我脑子里想不出其他的了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      相关资源
      最近更新 更多