我们在生产环境中有四个 Biztalk 服务器。发送端口配置为将传入消息写入一个文本文件。该端口一天接收数千条消息。因此,多个主机实例尝试一次写入文件,在一个实例完成写入完整记录之前,另一个实例开始写入新记录,导致数据分散在整个文件中。
我们能做些什么来解决这个问题?
...在一个实例完成写入完整记录之前,另一个实例开始写入新记录,导致数据分散在整个文件中。
我们能做些什么来解决这个问题?
简单的方法是仅使用单个主机实例将数据写入文件,但是您可能会开始遇到限制问题。或者,您可以探索使用文件适配器上的“允许写入时缓存”选项,这可能会提供一些改进。
但是,我认为您的方法是错误的。您不能指望四个独立且完全断开连接的进程(至少跨 4 个服务器)可靠地附加到单个文件 - 按顺序。
因此,我认为您应该重新设计此解决方案:
您可能需要考虑对这部分进行单例编排,以确保同时只发生一个 poll-write-update 过程。
如果 FIFO 很重要,BizTalk 具有有序的传递机制(支持 FILE 适配器),但它是以性能为代价的。
更好的解决方案是让实例写入单个文件,然后让另一个计划进程(或编排)将它们组合到一个文件中。您可以使用时间戳强制执行 FIFO。与前面提到的单例编排相比,这将提供更好的性能和资源利用率。其他选项可能是使用任何合适的队列实现。
您可以移动到数据库系统而不是文件。那将是非常简单的解决方案,也非常有效。如果您不想那样做,则必须在应用程序内部实现文件锁定或信号量,以便新线程将等待其他线程完成写入。