Service Broker 路由範例
此章節提供 Service Broker 路由處理的範例。每個範例都會包含 AdventureWorks 和 msdb 的路由表範例,並且描述 Service Broker 如何使用這些路由表來選擇訊息的路由。
此主題中所提供的路由表為 sys.routes 目錄檢視的簡化版本。對於路由處理而言,路由識別碼及擁有者並不重要,而且所有路由都會被視為具有無限期的存留時間。
remote_service_name 資料行中的 NULL 值與任何服務名稱相符。broker_instance 資料行中的 NULL 值則與任何 Service Broker 識別碼相符。
外寄訊息的範例不會使用 msdb 中的路由表,而內送訊息和訊息轉送的範例則不會使用 AdventureWorks 的路由表。
範例 1:預設組態
此範例描述 Service Broker 路由的預設組態。依預設,除 master 之外的所有資料庫都包含 AutoCreatedLocal 路由。因此,AdventureWorks 和 msdb 的路由表包含下列資訊。
AdventureWorks.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
msdb.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
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
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
OrderPartsRoute |
OrderParts |
NULL |
tcp://host2.Adventure-Works.com:4022/ |
NULL |
msdb.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
在此狀況下,OrderParts 服務之在 AdventureWorks 資料庫中建立的所有對話都與 OrderPartsRoute 路由相符。Service Broker 會將這些訊息傳送至網路位址 tcp://host2.Adventure-Works.com:4022/。其他所有交談則會傳遞至相同執行個體內的服務。
對於目標服務為 OrderParts 之在 AdventureWorks 中建立的交談,相符路由集合會包含 OrderPartsRoute,因為該路由與服務名稱完全相符。OrderPartsRoute 是相符路由集合中的唯一路由,因此 Service Broker 會選擇它。
對於不同目標服務之在 AdventureWorks 中建立的交談,相符路由集合會包含 AutoCreatedLocal。由於這是相符路由集合中的唯一路由,因此 Service Broker 會選擇它。如果訊息的服務不存在於本機執行個體中,Service Broker 則會將交談標示為 DELAYED。
對於從執行個體外部到達的交談,AutoCreatedLocal 是 msdb.sys.routes 中的唯一路由。該路由是相符路由集合中的唯一路由,因此 Service Broker 會選擇它。如果訊息的服務不存在於本機執行個體中,則會卸除此訊息。
範例 3:鏡像資料庫的網路路由
此範例描述鏡像資料庫所裝載的在目前執行個體外部之服務的典型路由組態。若要設定外部服務的路由,請在開始交談的資料庫中建立路由。在此範例中,AdventureWorks 包含 OrderParts 服務的路由。該路由同時包含 OrderParts 服務的網路位址和鏡像位址。
AdventureWorks.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
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
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
對於目標服務為 OrderParts 之在 AdventureWorks 中建立的交談,相符路由集合會包含 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
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
ExternalRoute |
NULL |
NULL |
tcp://forwarding.Adventure-Works.com:4022/ |
NULL |
msdb.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
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
名稱 |
remote_service_name |
broker_instance |
位址 |
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
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
對於 BalancedService 服務 (未指定 Service Broker 識別碼) 之在 AdventureWorks 資料庫中建立的交談,相符路由集合包含 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 識別碼。一旦接收到第一個收條,便會使用此收條中的 Service Broker 識別碼對交談上所有後面的訊息進行路由。
對於 BalancedService 服務 (在路由表中指定其中一個 Service Broker 識別碼) 之在 AdventureWorks 資料庫中建立的交談,相符路由集合包含與 Service Broker 識別碼相符的路由。此交談會路由至含有該 Service Broker 識別碼之路由的位址。
對於不同目標服務之在 AdventureWorks 中建立的交談,相符路由集合僅包含 AutoCreatedLocal。Service Broker 會選擇該路由。如果訊息的服務不存在於本機執行個體中,Service Broker 則會將交談標示為 DELAYED。
對於從執行個體外部到達的交談,AutoCreatedLocal 是 msdb.sys.routes 中的唯一路由。該路由是相符路由集合中的唯一路由,因此 Service Broker 會選擇它。如果訊息的服務不存在於本機執行個體中,則會卸除此訊息。
範例 6:特定服務的訊息轉送
此範例會將來自本機執行個體外部的訊息轉送至 tcp://elsewhere.Adventure-Works.com:4022/ 網路位址的 ElsewhereService 服務。對於所有其他服務,Service Broker 會將訊息傳遞至本機執行個體中的服務,或者,如果服務不存在於本機執行個體中,則將交談標示為 DELAYED。
AdventureWorks.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
msdb.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
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。請注意,ElsewhereService 服務之在 AdventureWorks 中建立的交談不會路由至 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
名稱 |
remote_service_name |
broker_instance |
位址 |
mirror_address |
---|---|---|---|---|
AutoCreatedLocal |
NULL |
NULL |
LOCAL |
NULL |
msdb.sys.routes
名稱 |
remote_service_name |
broker_instance |
位址 |
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 會卸除訊息。