2

我目前负责建立多环境 BizTalk 部署,我们计划在 BizTalk 组中部署两个或多个 BizTalk Server 以提供高可用性和可扩展性。

我们现在关心的是如何处理 WCF SQL 和文件适配器等适配器的并发性,因为例如对于 SQL 适配器,两个 BizTalk 接收主机可能会继续轮询同一个数据库表。

最初我对 SQL 的想法是使用锁定提示,但我不确定是否对此有任何其他担忧,或者是否有任何其他经过验证的解决方案。

对于文件适配器我知道可以设置接收适配器以在处理过程中更改文件的文件名,以便其他 BizTalk 主机将避免拾取文件但我不太确定此解决方案是否足以处理并发.

我将不胜感激任何帮助/建议。

非常感谢

4

3 回答 3

7

通常,大多数BizTalk 适配器会为您避免开箱即用的竞争条件。

例如,BizTalk 文件适配器已经实现了文件锁定,因此不同主机上的文件适配器的多个实例将不会读取同一个文件。

下面解释了文件重命名功能的用法(来自MSDN 文档

您还可以配置文件接收适配器以在处理文件时重命名文件。您应该重命名文件以确保在接收位置关闭并重新启动时接收适配器不会生成重复消息

在多个实例上运行时,有几个适配器是不安全的。这些包括(但可能还有其他)轮询方案中的 POP3、FTP、MSMQ/MSMQT 和数据库适配器。

对于这些适配器,您可以使用群集主机的 BizTalk 功能。这里有一篇文章解释了集群主机的使用和配置。这是确保您的 SQL 轮询不会产生重复的最简单方法。如果需要,您也可以在 SQL 级别实现此目的。

除此之外,您实际上正在深入了解业务流程的细节,并且您需要针对每种情况进行设计。例如 - 如果同一个文件由源系统提供两次,会发生什么?

有关此主题的更多信息,请参阅以下两个 SO 帖子:

BizTalk - 从 DB 接收端口读取两次

网络负载平衡 Biztalk 实例

于 2010-02-01T20:20:17.843 回答
0

MSDN的这一部分也可以帮助你:

http://msdn.microsoft.com/en-us/library/aa558765(BTS.20).aspx

于 2010-02-01T20:24:55.073 回答
0

感谢您的回答和您提供的链接。实际上我已经阅读了其中的一些,并且我还能够对这些解决方案进行一些测试。对于 SQL 适配器,BizTalk 主机群集被证明是一个很好的解决方案,但会导致您无法最大限度地利用 BizTalk 组(主机冗余)来实现可伸缩性目的。因此,出于这个原因,我们决定避免使用集群解决方案,但 MessageBox 确实需要集群以实现高可用性。我们试图完成的是有一个 Active / Active 或者我应该说通过 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

现在我仍在检查它,但不确定是否有可能解决这个问题。

非常感谢

于 2010-02-02T04:11:35.357 回答