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 都必须为转发实例正确配置传输安全模式。 由于实例不直接交换消息,因此实例不应将传输安全性配置为相互通信。