本主题讨论在将解决方案从 BizTalk 消息队列(MSMQT)适配器迁移到消息队列(MSMQ)适配器之前考虑的端到端有序传递、事务一致性、高可用性和可伸缩性。 为了本主题中的顺序传递、事务一致性、高可用性和可伸缩性的目的,其定义如下:
订购的交付。 保证消息按接收的相同顺序从 BizTalk Server 发送。
事务一致性。 确保由于硬件、软件或网络故障,正在处理的消息不会丢失或复制。
高可用性。 保证用于处理消息的服务始终可用于处理。
可伸缩性。 能够增加现有消息处理容量。
端到端有序交付
MSMQT 适配器可确保消息的端到端有序传递。 这意味着,如果 MSMQ 应用程序将消息 1、2 和 3 发送到绑定到 MSMQT 适配器的接收位置,则这些消息将按相同的顺序传递到 BizTalk Server 中的业务流程或发送端口:1、2、3。 此功能的一种用途可能包括必须按照收到的相同顺序提交和执行的股票市场交易。
使用 MSMQT 进行端到端的有序交付需要许多组件协同工作。 以下事件序列说明了如何使用 MSMQT 适配器完成此作:
远程计算机上的 MSMQ API 按顺序接收消息 1、2 和 3,并按相同顺序将它们推送到事务性本地队列:1、2、3。
远程计算机上的 MSMQ 客户端从队列获取消息并将其发送到 MSMQT 队列,顺序为:1、2、3。
MSMQT 适配器按顺序接收消息 1、2、3,并按相同顺序将它们交给 BizTalk MessageAgent 组件:1、2、3。
BizTalk MessageAgent 组件可确保消息按顺序发送到 MessageBox:1、2、3。
MessageBox 将消息路由,并确保如果消息被路由到同一服务编排或发送端口实例,它们会以相同的顺序传递到该实例:1、2、3。
在 BizTalk Server 2004 中,MSMQT 是唯一能够保证端到端有序交付的适配器。 所有其他集成的 BizTalk 适配器都可能会更改上面列出的步骤 3 到步骤 5 中的消息顺序。 大多数其他集成适配器通过使用称为“终结点管理器”的组件完成步骤 3,该组件本质上是多线程的,因此不会保留顺序。 BizTalk Server 2004 MSMQ 适配器使用“串行处理”功能来保留第三步的顺序,但随后不会要求 MessageAgent 继续保持顺序,因此消息可能会无序地路由到业务流程或发送端口。
使用 MSMQ 适配器进行端到端有序传递
若要使用 MSMQ 适配器实现端到端有序传递,请执行以下步骤:
在订阅业务流程或发送端口的接收端口上启用 “有序传递 ”属性。 在 BizTalk Server 中,接收业务流程中的端口和发送端口具有 有序传递 配置选项。 如果启用此选项,则业务流程接收端口或发送端口会要求 MessageBox 按照提交到 MessageBox 中的相同顺序向其传递消息。
将绑定到 MSMQ 适配器的接收位置的 “已排序处理 ”属性设置为
True。 在 BizTalk Server 中,可以将使用 MSMQ 传输的接收位置配置为使用有序处理,如果启用,则确保按照收到的相同顺序将消息发送到 MessageBox。将绑定到 MSMQ 适配器的接收位置的 事务 属性设置为
True。请确保由 MSMQ 接收位置监控的所有 MSMQ 队列都被标记为“事务性”。 必须在队列上设置此属性,以确保消息的有序传递。
注释
仅当 BizTalk 接收位置监视的 MSMQ 一个或多个队列仅由一台计算机提供服务时,才能保证有序传递。 这可能导致可伸缩性问题,如下所示。
使用 MSMQT 适配器处理消息与 MSMQ 适配器相比的事务使用情况
对于事务使用情况,MSMQT 和 MSMQ 适配器处理消息的方式之间存在一个关键差异。
使用 MSMQT 适配器时,从网络接收消息并使用 BizTalk Server 处理消息的过程在单个事务下进行处理。 使用 MSMQT 适配器时,为发送方生成的 ACK 消息表明消息已接收,并且已由 BizTalk Server 成功处理。
使用 MSMQ 适配器时,从网络接收消息并使用 BizTalk Server 处理消息的过程在两个单独的事务下进行处理,一个用于从网络接收,另一个用于使用 BizTalk Server 进行处理。 使用 MSMQ 适配器时,为发送方生成的 ACK 消息只是表明消息已成功从网络接收,而不是 BizTalk Server 已成功处理该消息。 无论是否安装 BizTalk Server,发送方都会从 Microsoft 消息队列服务器接收 ACK,消息在从网络接收到后会被保留到本地 MSMQ 队列中。 将消息保存到 MSMQ 队列后,BizTalk MSMQ 适配器会将其选取、处理并发布到 MessageBox。 如果此过程失败,消息将被发送到 BizTalk 挂起队列或在使用事务处理时保留在本地 MSMQ 队列中,发送方不会收到任何关于消息在 BizTalk Server 中处理失败的提示。
如果你的体系结构要求在 BizTalk Server 成功处理消息时接收 ACK,则在从 MSMQT 适配器迁移到 MSMQ 适配器时,必须添加应用程序级 ACK。 您需要更新编排和发送应用程序,以实现应用程序级别的确认机制(ACK)。
高可用性(事务性、顺序)
若要为 MSMQT 适配器提供高可用性,可以将多台计算机添加到接收主机,并为容错配置网络负载均衡(NLB),也可以将默认 BizTalk 主机群集。 如果您将 MSMQT 适配器与 NLB 一起运行,当一台服务器出现故障时,其他服务器将负责处理负载。 如果在群集主机上运行 MSMQT 适配器处理程序,如果一个主机节点发生故障,群集软件会将群集主机故障转移到另一个节点。 使用 MSMQ 适配器时,如果需要事务处理而不丢失数据,则 NLB 不起作用,因为 MSMQ 适配器使用本地 MSMQ 队列进行中间存储。 在此方案中,如果消息已传递到本地 MSMQ 队列,但 MSMQ 适配器尚未使用,则如果计算机失败,消息将丢失。
若要提供 MSMQ 适配器的高可用性和事务一致性,应执行以下作:
将Microsoft消息队列(MSMQ)配置为 BizTalk 服务器上的 Windows Server 群集组中的群集资源。
在 BizTalk 主机实例中配置 MSMQ 适配器接收处理程序,该处理程序已配置为群集 MSMQ 资源所在的群集组中的群集资源。
为 BizTalk 主机实例配置群集资源,使其依赖于群集 MSMQ 资源。
若要使用此体系结构实现有序传递,请遵循前面在“使用 MSMQ 适配器进行端到端有序传递”下介绍的步骤。
高可用性 (非事务性,不按顺序排列)
如果需要高可用性,但不需要事务处理,可以通过实现 NLB 并在多个 NLB 后面的 BizTalk 服务器上运行配置了 MSMQ 发送和接收处理程序的主机实例来实现此目的。 使用 MSMQ 实现 NLB 时,应遵循Microsoft知识库文章899611中所述的最佳做法 :消息队列如何通过网络负载均衡(NLB)运行。 在此方案中,如果某个 BizTalk 服务器失败,则在恢复 BizTalk 服务器之前,在该 BizTalk 服务器的主机实例中运行的消息将不可用。 此配置提供高可用性,因为如果其中一个 BizTalk 服务器不可用,NLB 会将请求路由到另一个 BizTalk 服务器。
可伸缩性 (非事务性,不按顺序排列)
可以通过遵循高可用性(非事务性)和添加其他主机实例的准则来实现可伸缩性。 此体系结构提供快速交付和可伸缩性,但不提供有序交付。
可伸缩性(事务性,不按顺序排列)
对于不带有序传递的消息的事务传递,可以将 NLB 与 MSMQ 和 Windows 群集结合使用。 此体系结构要求您在两个单独的 Windows 群集环境中,根据每个 Windows 群集下的“高可用性(事务性、按顺序)”步骤,配置至少两个群集组。 然后,实现 NLB 以在群集组之间分配负载。 由于 Windows NLB 不支持在 Windows 群集上运行,因此此方案需要硬件 NLB 解决方案。 下图说明了此体系结构。
注释
此体系结构不提供有序传递。
事务性可伸缩性(按顺序排列)
使用 MSMQ 3.0 或更早版本时,横向扩展可提供高可用性、事务一致性和有序传递的体系结构是有问题的,因为不支持远程事务读取,除非 BizTalk Server 计算机和远程 MSMQ 服务器都运行 MSMQ 4.0。 使用 MSMQ 3.0 或更早版本时,必须使用多个本地 MSMQ 队列来实现横向扩展。 此外,在这种情况下,如果 MSMQ 会话与 NLB 的 TCP/IP 连接断开,NLB 可能会将连接恢复到其他计算机,这可能会导致无序传输。
此限制的一种可能解决方法是通过将目标队列分配到不同的计算机来手动对消息传递进行负载均衡。 为此,可以将特定的 BizTalk 主机实例绑定到特定的 MSMQ 队列。 例如,如果收到来自一个特定贸易伙伴的大量文档,请为该贸易伙伴创建单独的主机并在特定的 BizTalk 服务器上接收队列。
如果可能,在需要远程事务读取和负载均衡时,在远程计算机上运行 MSMQ 4.0。
概要
下表总结了可用于适应特定功能的体系结构。
| 功能性 | NLB 也不群集 | NLB | 群集 | NLB 和集群 |
|---|---|---|---|---|
| 端到端有序交付 | 是的 | 否 | 是的 | 可以使用手动配置 |
| 事务一致性 | 否(如果发生服务失败,消息可能会丢失或重复) | 否 | 是的 | 是的 |
| 高度可用 | 否 | 是的 | 是的 | 是的 |
| 可缩放 | 否 | 是的 | 否 | 是的 |