我目前负责建立多环境BizTalk部署,我们计划在BizTalk组中部署两个或更多BizTalk Server,以提供高可用性和可伸缩性。
我们现在关注的是如何处理WCF SQL和文件适配器等适配器的并发性,因为例如SQL Adapter可能会在同一个数据库表上继续轮询两个BizTalk Receive主机。
最初我对SQL的想法是使用锁定提示,但我不确定是否有任何其他问题,或者是否有任何其他经过验证的解决方案。
对于文件适配器我所知道的是,可以将接收适配器设置为在处理期间更改文件的文件名,以便其他BizTalk主机将避免拾取文件但我不确定此解决方案是否足够处理并发。
我将不胜感激任何帮助/建议。
非常感谢
答案 0 :(得分:7)
在 general 中,大多数BizTalk适配器都会为您提供开箱即用的竞争条件。
例如,BizTalk文件适配器已实现文件锁定,因此不同主机上的多个文件适配器实例将不会读取同一文件。
文件重命名功能的使用说明如下(来自MSDN documentation)
您也可以配置文件 接收适配器以重命名文件 处理它们。你应该重命名 文件以确保接收 适配器不会生成重复 消息,如果接收位置是 关闭并重新启动
在多个实例上运行时,有几个适配器不安全。这些包括(但可能还有其他)POP3,FTP,MSMQ / MSMQT和数据库适配器在轮询方案中。
对于这些适配器,您可以使用群集主机的BizTalk功能。有一篇帖子here解释了群集主机的使用和配置。这是确保SQL轮询不会产生重复的最简单方法。如果需要,您还可以在SQL级别实现此目的。
除此之外,您真正了解业务流程的细节,您需要为每个案例进行设计。例如 - 如果源系统提供两次相同的文件会发生什么?
有关此主题的更多信息,请参阅以下两篇SO帖子:
答案 1 :(得分:0)
MSDN的这一部分也可以帮助你:
http://msdn.microsoft.com/en-us/library/aa558765(BTS.20).aspx
答案 2 :(得分:0)
感谢您提供的答案和链接。实际上我已经阅读了其中一些,我也能够对这些解决方案进行一些测试。 对于SQL适配器,BizTalk主机群集被证明是一个很好的解决方案,但会导致您无法最大限度地利用BizTalk Group(主机冗余)的优势来实现可伸缩性。因此,出于这个原因,我们已经决定避免使用群集解决方案,但对于真正需要群集以实现高可用性的MessageBox。 我们要完成的是拥有一个主动/主动或者我应该通过BizTalk Server Group说负载平衡,这意味着我们真的会同时进行多个SQL接收适配器轮询。 最初我的解决方案是在查询级别处理它通过锁定提示,下面是我的SP样本。
MERGE INTO EmployeeComp
USING (SELECT EmployeeID
FROM
[AdventureWorks].[dbo].[EmployeeComp]
WITH (READPAST, UPDLOCK)
WHERE
[AdventureWorks].[dbo].[EmployeeComp].[Status] = 0) e(EmployeeID)
ON EmployeeComp.EmployeeID = e.EmployeeID
WHEN MATCHED THEN
UPDATE SET
STATUS = 2
OUTPUT Inserted.EmployeeID, Inserted.Name, Inserted.Status;
您能否就我创建的SP提供一些反馈?我做了几次测试,BizTalk WCF-SQL适配器读取了大约500,000个数据,然后同时写入了数千个数据,并证明它正如我所期望的那样工作。
虽然解决方案似乎还不错,但我还不确定对这种解决方案有什么影响,也许你可以解释一下这个问题呢?
此外,我在考虑是否可以使用本文中的SQL Server Service Broker。 http://blogs.msdn.com/adapters/archive/2008/06/30/using-the-wcf-sql-adapter-to-read-messages-from-ssb-queues-and-submit-them-to-biztalk.aspx
现在我还在检查它,还不确定是否有可能解决这个问题。
非常感谢