消息队列可以在网络负载均衡上运行。

本文介绍了 Microsoft 消息队列 (MSMQ) 如何在网络负载均衡 (NLB) 上运行。

原产品版本:微软消息队列
原始 KB 数: 899611

介绍

以下文章探讨了MSMQ如何通过NLB进行功能。 本文还讨论了 MSMQ 的可能错误配置。

重要

本文包含有关如何修改注册表的信息。 请在修改注册表之前,确保进行备份。 确保您知道如果出现问题,如何恢复注册表。 有关如何备份、恢复和修改注册表的更多信息,请参阅高级用户的 Windows 注册表信息

支持的配置

在以下配置中,MSMQ 支持在 NLB 环境中进行消息的发送和接收。

  • 使用 Direct=TCP 进行非事务性消息传递
  • 使用 Direct=OS 进行非事务性消息传递,并禁用验证
  • 使用 Direct=HTTP 进行非事务消息传递
  • 使用一种特定配置进行事务消息传递,该配置使用存储和转发服务器以及单个后端服务器。

注意

在这些配置中的任何一个中,只有私有队列被支持作为目标。 由于虚拟网络名称没有相应的 Active Directory 目录服务对象,因此无法查询目标队列的属性。 只要通过直接格式名称而不是标准路径访问公共队列,您就可以向公共队列发送消息。

使用 Direct=TCP 进行非事务性消息传递

该配置不需要任何特殊配置更改即可正常运行。

使用Direct=OS进行非事务性消息传递

仅当验证被禁用时,此配置才有效。 若要禁用验证,您必须在 MSMQ 2.0 中添加与 Windows 2000 一起使用的以下注册表项,以及在 MSMQ 3.0 中添加与 Windows XP 或 Windows Server 2003 一起使用的注册表项。

警告

如果您使用注册表编辑器或其他方法不正确地修改注册表,可能会出现严重问题。 这些问题可能需要您重新安装操作系统。 微软无法保证能够解决这些问题。 修改注册表时需自行承担风险。 请按照以下步骤操作,然后退出注册表编辑器。

  1. 单击“ 开始”,单击“ 运行”,键入 regedit,然后单击“ 确定”。
  2. 在注册表中找到并单击以下键:
    HKEY_LOCAL_MACHINE\Software\Microsoft\MSMQ\Parameters
  3. 编辑 菜单上,指向 新建,然后点击 DWORD 值
  4. 输入IgnoreOSNameValidation,然后按ENTER键。
  5. “编辑 ”菜单上,单击“ 修改”。
  6. 键入 1,然后单击“ 确定”。

默认情况下,MSMQ 验证收到的消息以确定该消息是否是针对本地计算机的。 如果消息不是针对本地计算机的,该消息将被拒绝。

当消息发送到一个位于网络负载均衡器后方的服务器时,消息可以通过负载均衡器的名称发送,或者通过分配给网络负载均衡器中虚拟IP的网络名称发送。 然后,网络负载均衡器将消息路由到一个MSMQ接收器。 然而,本地 MSMQ 接收者的队列管理器发现消息中的计算机名称和目标名称不匹配,因此队列管理器丢弃了该消息。 设置此注册表值后,MSMQ 将不再验证目标计算机名称并将接受该消息。

使用 Direct=HTTP 进行非事务消息传递

此配置无需任何特别的配置更改即可支持。

使用特定配置进行事务消息传递,该配置使用存储转发服务器和单一后端服务器。

在这种配置中,事务性消息传递仅支持 HTTP 消息传递,当接收消息的节点将接收队列映射到单个后端服务器时。 HTTP事务消息在目标队列位于单个节点时不受支持。

有关此配置的详细信息,请参阅适用于 Windows Server 2003 和 Windows XP Professional 的 Microsoft 消息队列 (MSMQ) HTTP 部署方案白皮书。

事务性消息传递的配置中,目标队列位于每个成员节点的负载均衡器之后,因以下原因,不支持发送或接收消息:

  • 重复消息
  • 未确认的消息在发送者端
  • 未完成的交易

事务消息和确认

当计算机接收到事务消息时,消息将被写入存储,消息会被记录,并且一个订单确认将被发送回发送者。 订单确认通过 direct=TCP 被发送回原始消息来源的 IP 地址。 然后,消息由发送方接收,并从发送队列中删除。

在指定时间内,如果发送服务器未收到确认,原始消息将被重新发送。 当消息到达目的地时,目的地服务器检查日志,并发现该服务器已经接收到该消息。 因此,目标服务器拒绝了该消息并发回了另一个确认。 目标服务器将继续发送确认,直到发送方收到订单确认。 日志记录防止重复消息被接收,并且订单确认向发送者确认消息已被接收。

网络负载均衡器和事务性消息的问题

当消息通过负载均衡器发送时,目标计算机会将该消息视为来自负载均衡器。 然后,目标计算机通过新的会话发送订单确认。 因此,负载均衡器不能使用相同的逻辑来维护 Web 服务器或类似服务的状态。

在这种情况下,最常见的问题是,多个服务器通过负载均衡器发送消息,但所有的订单确认都被发送到了错误的服务器。 这种行为会导致未确认的消息在发送计算机的发出队列中堆积。 此外,当发件人未收到订单确认时,发件人将重新发送消息。 第二次尝试通过负载均衡器发送消息时,可能会将消息发送到不同的计算机。 这台计算机以前未曾看到过此消息,该消息将作为新消息进行处理。 请记住,验证已被禁用,以便消息可以通过 NLB 进行传输。

一条通过负载均衡器发送的消息可能会被负载均衡器后面的所有服务器接收并处理一次,然后才收到订单确认。 此外,跨越多个消息的事务无法总是被处理或按顺序到达。 因此,当您使用 NLB 时,MSMQ 不支持发送事务性消息。