Service Broker 路由示例

适用于:SQL ServerAzure SQL 托管实例

本部分提供 Service Broker 路由过程的示例。 每个示例都包含示例路由表 AdventureWorks2008R2msdb并介绍了 Service Broker 如何使用这些路由表为消息选择路由。

注意

本文中的代码示例是使用 AdventureWorks2025 示例数据库进行测试的,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。

本主题中提供的路由表是目录视图的 sys.routes 简化版本。 路由 ID 和所有者对于路由过程并不重要,所有路由都被视为具有无限期的生存期。

列中的值NULLremote_service_name与任何服务名称匹配。 在NULL列中,broker_instance的值与任何 Service Broker 标识符匹配。

传出消息的示例不使用msdb中的路由表,而传入消息和消息转发的示例不使用AdventureWorks2008R2中的路由表。

示例 1:默认配置

此示例说明 Service Broker 路由的默认配置。 默认情况下,除master数据库外,所有数据库都包含AutoCreatedLocal路由。 因此,路由表包含AdventureWorks2008R2msdb以下信息。

AdventureWorks2008R2 msdb
name AutoCreatedLocal AutoCreatedLocal
remote_service_name NULL NULL
broker_instance NULL NULL
address LOCAL LOCAL
mirror_address NULL NULL

在这种情况下,在 AdventureWorks2008R2 数据库中创建的所有对话都传送到当前实例中的服务。 此外,来自实例外部的所有对话也传递给当前实例中的一个服务。

对于AdventureWorks2008R2中创建的对话,AutoCreatedLocal是唯一的路径。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果本地实例中不存在消息的服务,则会删除该消息。

对于来自实例外部的会话,过程同上。 对于从实例外部到达的对话,AutoCreatedLocal 是在 msdb.sys.routes 中的唯一路由。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果本地实例中不存在消息的服务,则会删除该消息。

示例 2:网络路由到特定服务

此示例说明当前实例外的服务所用的典型路由配置。 若要配置指向外部服务的路由,请在开始会话的数据库中创建该路由。 在此示例中, AdventureWorks2008R2 包含服务的 OrderParts路由。 路由包含服务的网络地址 OrderParts

AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal OrderPartsRoute AutoCreatedLocal
remote_service_name NULL OrderParts NULL
broker_instance NULL NULL NULL
address LOCAL TCP://host2.Adventure-Works.com:4022/ LOCAL
mirror_address NULL NULL NULL

在这种情况下,在 AdventureWorks2008R2 数据库中创建的所有对话与服务 OrderParts 匹配路由 OrderPartsRoute。 Service Broker 将这些消息发送到网络地址 TCP://host2.Adventure-Works.com:4022/。 所有其他会话传递到同一实例的各服务中。

对于使用目标服务AdventureWorks2008R2创建的OrderParts会话,匹配路由集包含OrderPartsRoute,因为此路由与服务名称完全匹配。 OrderPartsRoute 是匹配路由集中的唯一路由,因此 Service Broker 选择该路由。

对于创建 AdventureWorks2008R2 到其他目标服务的对话,匹配路由集包含 AutoCreatedLocal。 由于这是匹配路由集中的唯一路由,Service Broker 会选择该路由。 如果消息的服务在本地实例中不存在,Service Broker 将标记会话 DELAYED

对于从实例外部到达的对话,AutoCreatedLocal 是在 msdb.sys.routes 中的唯一路由。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果本地实例中不存在消息的服务,则会删除该消息。

示例 3:到镜像数据库的网络路由

此示例说明在当前实例之外的镜像数据库所承载的服务的典型路由配置。 若要配置指向外部服务的路由,请在开始会话的数据库中创建该路由。 在此示例中, AdventureWorks2008R2 包含服务的 OrderParts路由。 路由包含服务的网络地址和镜像地址 OrderParts

AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal OrderPartsRoute AutoCreatedLocal
remote_service_name NULL OrderParts NULL
broker_instance NULL NULL NULL
address LOCAL TCP://partner1.Adventure-Works.com:4022/ LOCAL
mirror_address NULL TCP://partner2.Adventure-Works.com:4022/ NULL

对于使用目标服务AdventureWorks2008R2创建的OrderParts会话,匹配路由集包含OrderPartsRoute,因为此路由与服务名称完全匹配。 OrderPartsRoute 是匹配路由集中的唯一路由,因此 Service Broker 选择该路由。 Service Broker 检查地址和镜像地址,以确定哪个伙伴是主体,然后将消息发送给该主体。

对于创建 AdventureWorks2008R2 到其他目标服务的对话,匹配路由集包含 AutoCreatedLocal。 由于这是匹配路由集中的唯一路由,Service Broker 会选择该路由。 如果消息的服务在本地实例中不存在,Service Broker 将标记会话 DELAYED

对于从实例外部到达的对话,AutoCreatedLocal 是在 msdb.sys.routes 中的唯一路由。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果本地实例中不存在消息的服务,则会删除该消息。

示例 4:网络路由到所有外部服务

本示例将消息从服务 AdventureWorks2008R2 发送到其他实例,除非服务存在于本地实例中。 非本地实例的服务的消息将转到同一网络地址。 如果该网络地址上的 SQL Server 实例执行消息转发,则此配置可能很有用。

在此示例中, AdventureWorks2008R2 数据库包含 AutoCreatedLocal 路由和地址 TCP://forwarding.Adventure-Works.com:4022/的路由。

AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal ExternalRoute AutoCreatedLocal
remote_service_name NULL NULL NULL
broker_instance NULL NULL NULL
address LOCAL TCP://forwarding.Adventure-Works.com:4022/ LOCAL
mirror_address NULL NULL NULL

对于在其中AdventureWorks2008R2创建的会话,匹配路由集包含这两个AutoCreatedLocalExternalRoute路由,因为远程服务名称和中转站实例对于这两个路由都是相同的。 Service Broker 必须在这两个路由之间做出选择。 Service Broker 在指定网络地址的路由之前选择具有地址 'LOCAL' 的路由,因此 Service Broker 首先选择 AutoCreatedLocal。 如果目标服务位于本地实例中,则 Service Broker 将使用此路由并向该服务传递消息。 但是,如果本地实例中不存在目标服务,Service Broker 会选择 ExternalRoute

对于从实例外部到达的对话,AutoCreatedLocal 是在 msdb.sys.routes 中的唯一路由。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果本地实例中不存在消息的服务,则会删除该消息。

示例 5:网络路由指向服务的不同实例

此示例显示一个路由配置,在该配置中,两个不同的网络地址承载同一服务的不同实例。 此配置可能对负载均衡配置有用。

在此示例中, AdventureWorks2008R2 数据库包含 AutoCreatedLocal 路由以及到服务的 BalancedService路由。

AdventureWorks2008R2 AdventureWorks2008R2 AdventureWorks2008R2 msdb
name AutoCreatedLocal BalancedRouteOne BalancedRouteTwo AutoCreatedLocal
remote_service_name NULL BalancedService BalancedService NULL
broker_instance NULL 5fb8d92b-ed69-4c80-afbb-2aa6a7d3cb2d 81b1d3d0-288e-4d2c-b1d3-456cbb944b4f NULL
address LOCAL TCP://server1.Adventure-Works.com:4022/ TCP://server2.Adventure-Works.com:4022/ LOCAL
mirror_address NULL NULL NULL NULL

对于在 AdventureWorks2008R2 数据库中创建的、未指定 Service Broker 标识符的服务 BalancedService 的对话,匹配的路由集要么包含 BalancedRouteOne,要么包含 BalancedRouteTwo。 由于路由包含不同的 Service Broker 标识符,因此匹配过程任意选择 Service Broker 标识符并匹配该路由。 由于只有一个路由匹配,Service Broker 会为会话选择该路由。 结果是,某些对话路由到 TCP://server1.Adventure-Works.com:4022/,而其他对话路由到 TCP://server2.Adventure-Works.com:4022/。 但是,Service Broker 收到会话中某个消息的确认后,它会将该确认中包含的 Service Broker 标识符用于会话中的其他消息。 收到第一个确认后,该会话中以后的所有消息都将使用该确认中的 Service Broker 标识符进行路由。

对于在 AdventureWorks2008R2 数据库中创建的会话到在路由表中指定其中一个 Service Broker 标识符的服务 BalancedService ,匹配路由集包含与 Service Broker 标识符匹配的路由。 该会话路由到具有该 Service Broker 标识符的路由中的地址。

对于生成的从 AdventureWorks2008R2 到其他目标服务的对话,匹配路由集仅包含AutoCreatedLocal。 Service Broker 将选择该路由。 如果消息的服务在本地实例中不存在,Service Broker 将标记会话 DELAYED

对于从实例外部到达的对话,AutoCreatedLocal 是在 msdb.sys.routes 中的唯一路由。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果本地实例中不存在消息的服务,则会删除该消息。

示例 6:特定服务的消息转发

此示例将消息从本地实例外部转发到服务 ElsewhereService,并发送到网络地址 TCP://elsewhere.Adventure-Works.com:4022/。 对于所有其他服务,Service Broker 会将消息传递到本地实例中的服务,或者如果本地实例中不存在服务,则标记会话 DELAYED

AdventureWorks2008R2 msdb msdb
name AutoCreatedLocal AutoCreatedLocal ForwardingRoute
remote_service_name NULL NULL ElsewhereService
broker_instance NULL NULL NULL
address LOCAL LOCAL TCP://elsewhere.Adventure-Works.com:4022/
mirror_address NULL NULL NULL

对于AdventureWorks2008R2中创建的对话,AutoCreatedLocal是唯一的路径。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果消息的服务在本地实例中不存在,Service Broker 将标记会话 DELAYED。 在AdventureWorks2008R2中创建到服务ElsewhereService的对话不会路由到TCP://elsewhere.Adventure-Works.com:4022/

对于从实例外部到达服务 ElsewhereService的对话,路由 ForwardingRoute 与服务名称完全匹配。 因此, ForwardingRoute 是匹配路由集中的唯一路由,Service Broker 在消息转发处于打开状态时选择该路由。 即使本地实例包含服务 ElsewhereService,Service Broker 也会选择此路由。 如果关闭消息转发,Service Broker 将删除消息。

对于来自实例外部到达至其他所有服务的会话来说,AutoCreatedLocalmsdb.sys.routes 中唯一匹配的路由。 Service Broker 将选择该路由。 如果本地实例中不存在消息的服务,则会删除该消息。

未包含在实例中的所有服务的消息转发示例 7

此示例将来自本地实例外部的消息发送给其他实例(在本地实例中不存在目标服务的情况下)。 所有外部服务的消息将转到同一网络地址。 此配置对于消息转发可能很有用。

AdventureWorks2008R2 msdb msdb
name AutoCreatedLocal AutoCreatedLocal ForwardingRoute
remote_service_name NULL NULL NULL
broker_instance NULL NULL NULL
address LOCAL LOCAL TCP://forwarding.Adventure-Works.com:4022/
mirror_address NULL NULL NULL

对于AdventureWorks2008R2中创建的对话,AutoCreatedLocal是唯一的路径。 该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。 如果消息的服务在本地实例中不存在,Service Broker 将标记会话 DELAYED

对于从数据库外部到达的对话,匹配路由集包含AutoCreatedLocalForwardingRoute 路由,因为两个路由都指定了相同的远程服务名称和 Service Broker 标识符。 Service Broker 必须在这两个路由之间做出选择。 Service Broker 在指定网络地址的路由之前选择具有地址 'LOCAL' 的路由,因此 Service Broker 首先选择 AutoCreatedLocal。 如果目标服务位于本地实例中,则 Service Broker 将使用此路由并向该服务传递消息。 但是,如果本地实例中不存在目标服务,并且消息转发处于打开状态,Service Broker 会选择ForwardingRoute所选。 如果未启用消息转发,则 Service Broker 会删除该消息(如果目标服务在本地实例中不存在)。