Service Broker 消息转发

Service Broker 消息转发允许 SQL Server 的实例接受来自实例外部的消息并将这些消息发送给其他实例。

管理员可以使用消息转发完成以下任务:

  • 提供处于不同可信域中的服务器之间的连接

  • 通过创建一个含有域的路由信息的集中实例来简化管理

  • 在几个实例间分派工作

启用转发后,msdb.sys.routes 中的路由表将确定是否转发来自另一个实例的消息。如果匹配路由的地址不是 LOCAL,则 SQL Server 将消息转发到指定的地址。否则,该消息只在本地进行传递。

每个 Service Broker 消息都包含一个最大生存期和该消息已转发的次数。当一个实例转发消息时,该实例会增加此消息的转发计数。如果消息超过了最大生存期,则转发实例会放弃该消息。在可能存在路由循环的情况下,此策略有助于避免出现问题。

转发和可靠传递

转发消息的实例不对发送方确认消息。只有最终目标才确认消息。如果在一段时间后发送方没有收到来自目标的确认,则发送方将重试发送该消息。

执行消息转发的实例不需要存储转发的消息。而是由 SQL Server 在内存中保留要转发的消息。可用于消息转发的内存量是在 Service Broker 端点配置中指定的。此策略支持高效、无状态的消息转发。如果执行消息转发的实例失败,任何消息都不会丢失。在最终目标确认消息前,所有消息始终都在发送方保存,详细信息请参阅Service Broker 通信协议

管理视图 sys.dm_broker_forwarded_messages 包含当前正在由实例进行转发的消息的相关信息。实例不保存正在转发的消息,这些消息只存在于内存中。发送消息的实例和接收消息的实例保存消息。在接收实例确认消息回执之前,发送实例不会删除该消息。

安全模式和转发

Service Broker 消息转发不要求转发实例对转发消息进行解密。因此,只有参与会话的数据库必须配置对话安全模式。

但是,由于传输安全模式应用于 SQL Server 实例间的连接,因此每个 SQL Server 实例都必须为与其直接进行通信的实例正确配置传输安全模式。例如,如果实例 A 与实例 B 通过一个转发实例进行通信,则实例 A 和实例 B 都必须为转发实例正确配置传输安全模式。由于这两个实例不直接交换消息,因此它们不应为相互间通信配置传输安全模式。