Service Broker 路由示例
本部分提供 Service Broker 路由过程的示例。每个示例包含 AdventureWorks 和 msdb 的示例路由表,并说明 Service Broker 如何使用这些路由表来为消息选择路由。
本主题提供的路由表是 sys.routes 目录视图的简化版本。对于此路由过程来说,路由 id 和所有者并不重要,而且所有路由的生存期都被认为无限长。
remote_service_name 列中的值为 NULL 可匹配任何一个服务名称。broker_instance 列中的值为 NULL 可匹配任何一个 Service Broker 标识符。
传出消息的示例不使用 msdb 中的路由表,并且传入消息和消息转发的示例不使用 AdventureWorks 的路由表。
示例 1:默认配置
此示例说明 Service Broker 路由的默认配置。默认情况下,除 master 之外的所有数据库都包含 AutoCreatedLocal 路由。因此,AdventureWorks 和 msdb 的路由表包含下列信息。
AdventureWorks.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
msdb.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
在此情况下,在 AdventureWorks 数据库中创建的所有对话都传递给当前实例中的一个服务。此外,来自实例外部的所有对话也传递给当前实例中的一个服务。
对于在 AdventureWorks 中创建的会话,AutoCreatedLocal 是 AdventureWorks.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则将删除该消息。
对于来自实例外部的会话,过程同上。对于在实例外部创建的会话,AutoCreatedLocal 是 msdb.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则将删除该消息。
示例 2:指向特定服务的网络路由
此示例说明当前实例外的服务所用的典型路由配置。若要配置指向外部服务的路由,请在开始会话的数据库中创建该路由。在此示例中,AdventureWorks 包含服务 OrderParts 的路由。该路由包含 OrderParts 服务的网络地址。
AdventureWorks.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
OrderPartsRoute |
OrderParts |
NULL |
tcp://host2.Adventure-Works.com:4022/ |
NULL |
msdb.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
在此情况下,在 AdventureWorks 数据库中创建的指向服务 OrderParts 的所有对话匹配路由 OrderPartsRoute。Service Broker 将这些消息发送到网络地址 tcp://host2.Adventure-Works.com:4022/。所有其他会话传递到同一实例的各服务中。
对于在 AdventureWorks 中创建的目标服务为 OrderParts 的会话,匹配路由组中将包含 OrderPartsRoute,因为此路由与该服务名称完全匹配。OrderPartsRoute 是匹配路由组中的唯一路由,因此 Service Broker 将选择该路由。
对于在 AdventureWorks 中创建的与其他目标服务的会话,匹配路由组中将包含 AutoCreatedLocal。由于这是匹配路由组中的唯一路由,因此 Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则 Service Broker 会将该会话标记为 DELAYED。
对于在实例外部创建的会话,AutoCreatedLocal 是 msdb.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则将删除该消息。
示例 3:指向镜像数据库的网络路由
此示例说明当前实例外镜像数据库所承载的服务的典型路由配置。若要配置指向外部服务的路由,请在开始会话的数据库中创建该路由。在此示例中,AdventureWorks 包含服务 OrderParts 的路由。该路由包含 OrderParts 服务的网络地址和镜像地址。
AdventureWorks.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
OrderPartsRoute |
OrderParts |
NULL |
tcp://partner1.Adventure-Works.com:4022/ |
tcp://partner2.Adventure-Works.com:4022/ |
msdb.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
对于在 AdventureWorks 中创建的目标服务为 OrderParts 的会话,匹配路由组中将包含 OrderPartsRoute,因为此路由与该服务名称完全匹配。OrderPartsRoute 是匹配路由组中的唯一路由,因此 Service Broker 将选择该路由。Service Broker 检查地址和镜像地址,以确定哪个伙伴是主体,然后将消息发送给该主体。
对于在 AdventureWorks 中创建的与其他目标服务的会话,匹配路由组中将包含 AutoCreatedLocal。由于这是匹配路由组中的唯一路由,因此 Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则 Service Broker 会将该会话标记为 DELAYED。
对于在实例外部创建的会话,AutoCreatedLocal 是 msdb.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则将删除该消息。
示例 4:指向所有外部服务的网络路由
此示例将来自 AdventureWorks 中的服务的消息发送给另一个实例(在本地实例中不存在目标服务的情况下)。请注意,所有不在本地实例中的服务的消息都转至同一网络地址。如果位于该网络地址的 SQL Server 实例执行消息转发,则此配置可能很有用。
在此示例中,AdventureWorks 数据库包含 AutoCreatedLocal 路由,以及指向地址 tcp://forwarding.Adventure-Works.com:4022/ 的路由。
AdventureWorks.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
ExternalRoute |
NULL |
NULL |
tcp://forwarding.Adventure-Works.com:4022/ |
NULL |
msdb.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
对于在 AdventureWorks 中创建的会话,匹配路由集包含 AutoCreatedLocal 和 ExternalRoute,因为对于这两个路由来说,远程服务名称和 Broker 实例是相同的。Service Broker 必须在这两个路由之间做出选择。相对于指定网络地址的路由,Service Broker 会首先选择地址为 LOCAL 的路由,因此 Service Broker 将首先选择 AutoCreatedLocal。如果目标服务位于本地实例中,则 Service Broker 将使用此路由并向该服务传递消息。但是,如果本地实例中不存在目标服务,Service Broker 将选择 ExternalRoute。
对于在实例外部创建的会话,AutoCreatedLocal 是 msdb.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则将删除该消息。
示例 5:指向一个服务的不同实例的网络路由
此示例显示一个路由配置,在该配置中,两个不同的网络地址承载同一服务的不同实例。对于负载平衡配置来说,此配置可能很有用。
在此示例中,AdventureWorks 数据库包含 AutoCreatedLocal 路由,以及指向服务 BalancedService 的路由。
AdventureWorks.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
BalancedRouteOne |
BalancedService |
5fb8d92b-ed69-4c80-afbb-2aa6a7d3cb2d |
tcp://server1.Adventure-Works.com:4022/ |
NULL |
BalancedRouteTwo |
BalancedService |
81b1d3d0-288e-4d2c-b1d3-456cbb944b4f |
tcp://server2.Adventure-Works.com:4022/ |
NULL |
msdb.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
对于在 AdventureWorks 数据库中创建、指向服务 BalancedService 但不指定 Service Broker 标识符的会话,匹配路由集包含 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 标识符进行路由。
对于在 AdventureWorks 数据库中创建、指向服务 BalancedService 且指定路由表中的一个 Service Broker 标识符的会话,匹配路由集包含与该 Service Broker 标识符相匹配的路由。该会话路由到具有该 Service Broker 标识符的路由中的地址。
对于在 AdventureWorks 中创建的指向另一目标服务的会话,匹配路由集只包含 AutoCreatedLocal。Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则 Service Broker 会将该会话标记为 DELAYED。
对于在实例外部创建的会话,AutoCreatedLocal 是 msdb.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则将删除该消息。
示例 6:特定服务的消息转发
此示例将从本地实例外部发送到服务 ElsewhereService 的消息转发到网络地址 tcp://elsewhere.Adventure-Works.com:4022/。对于所有其他服务,Service Broker 将消息传递给本地实例中的服务,如果本地实例中不存在该服务,Service Broker 会将该会话标记为 DELAYED。
AdventureWorks.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
msdb.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
ForwardingRoute |
ElsewhereService |
NULL |
tcp://elsewhere.Adventure-Works.com:4022/ |
NULL |
对于在 AdventureWorks 中创建的会话,AutoCreatedLocal 是 AdventureWorks.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则 Service Broker 会将该会话标记为 DELAYED。请注意,在 AdventureWorks 中创建的指向服务 ElsewhereService 的会话不路由到 tcp://elsewhere.Adventure-Works.com:4022/。
对于来自实例外部、指向服务 ElsewhereService 的会话,路由 ForwardingRoute 与该服务名称完全匹配。因此,ForwardingRoute 是匹配路由集中唯一的一个路由,并且在消息转发开启时 Service Broker 会选择该路由。即使本地实例包含服务 ElsewhereService,Service Broker 也会选择此路由。如果关闭消息转发,Service Broker 将删除消息。
对于来自实例外部、指向所有其他服务的会话,AutoCreatedLocal 是 msdb.sys.routes 中唯一的一个匹配路由。Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则将删除该消息。
示例 7:实例外所有服务的消息转发
此示例将来自本地实例外部的消息发送给其他实例(在本地实例中不存在目标服务的情况下)。请注意,所有外部服务的消息都转至同一网络地址。对于消息转发来说,此配置可能很有用。
AdventureWorks.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
msdb.sys.routes
name |
remote_service_name |
broker_instance |
address |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
ForwardingRoute |
NULL |
NULL |
tcp://forwarding.Adventure-Works.com:4022/ |
NULL |
对于在 AdventureWorks 中创建的会话,AutoCreatedLocal 是 AdventureWorks.sys.routes 中的唯一路由。该路由是匹配路由组中的唯一路由,Service Broker 将选择该路由。如果本地实例中不存在该消息的服务,则 Service Broker 会将该会话标记为 DELAYED。
对于来自数据库外部的会话,匹配路由集包含 AutoCreatedLocal 和 ForwardingRoute,因为这两个路由所指定的远程服务名称和 Service Broker 标识符都相同。Service Broker 必须在这两个路由之间做出选择。相对于指定网络地址的路由,Service Broker 会首先选择地址为 LOCAL 的路由,因此 Service Broker 将首先选择 AutoCreatedLocal。如果目标服务位于本地实例中,则 Service Broker 将使用此路由并向该服务传递消息。但是,如果本地实例中不存在目标服务,并且消息转发是开启的,则 Service Broker 会选择 ForwardingRoute。如果消息转发未开启,且本地实例中不存在目标服务,则 Service Broker 将删除消息。