Service Broker 路由

此主題描述 Service Broker 如何傳遞訊息的詳細資料。如需概觀,請參閱<路由>。

對於大多數應用程式,使用 Service Broker 路由的簡單方法就夠了。在每個包含服務的資料庫中,指定與此服務通訊之外部服務的路由。但是,Service Broker 還提供複雜的路由系統,以供處理應用程式需要更複雜行為的情況。如需說明路由處理的範例,請參閱<Service Broker 路由範例>。

路由處理描述

SQL Server 維護兩個相異層級的路由資訊。每個資料庫都包含一個本機路由資料表 sys.routes,以供在該資料庫中開始交談。對於源自 SQL Server 執行個體內的交談,SQL Server 會在建立交談的資料庫中搜尋路由表。對於從執行個體之外到達的交談,SQL Server 會搜尋 msdb.sys.routes

不論交談源自執行個體內或外,基本的比對程序是相同的。處理會忽略已過期的路由。路由處理由三個相異的步驟組成:

  1. 尋找符合的路由。Service Broker 會比對服務名稱與 Service Broker 識別碼,尋找一組可能的路由。

  2. 選擇路由。Service Broker 會從一組可能的路由中選擇路由。

  3. 尋找目的地服務。當選定的路由將 'LOCAL' 指定為網路位址時,Service Broker 會在執行個體內尋找服務。如果執行個體中不存在服務,則 Service Broker 會返回步驟 2,選擇另一個路由。

當訊息從起始端傳送至目標端,且起始端從目標端收到了一則收條訊息,起始端就會使用收條訊息中的 Service Broker 識別碼,將後續訊息傳遞至相同的目標端。Service Broker 會處理收條訊息;此程序對使用 Service Broker 的應用程式不會有任何影響。如需有關收條訊息的詳細資訊,請參閱<Service Broker 通訊協定>。

回覆來自目標服務的訊息

從執行個體之外到達的訊息來自目標端服務時,SQL Server 會檢查目前的執行個體是否包含訊息中的 Service Broker 識別碼。如果是,則訊息會在目前的執行個體內傳遞,如「尋找目的地服務」中所述。否則,SQL Server 會遵循標準比對處理。

尋找相符的路由

下列程序描述 SQL Server 如何比對路由。在每個步驟中,如果有一或多個路由相符,則比對程序會結束,Service Broker 會選擇下列其中一個相符的路由:

  1. 如果交談指定 Service Broker 識別碼,則會尋找服務名稱和 Service Broker 識別碼都完全相符的路由。

  2. 在不指定 Service Broker 識別碼的路由中尋找服務名稱完全相符的路由。

  3. 如果交談不指定 Service Broker 識別碼,則會在指定 Service Broker 識別碼的路由中尋找服務名稱完全相符的路由。如果路由表包含與服務名稱相符,而且擁有不同 Service Broker 識別碼的路由,請任意選取一個 Service Broker 識別碼。接著,僅比對使用該 Service Broker 識別碼的路由。

  4. 如果存在至動態路由服務的路由,並且未暫止任何路由至該服務的要求,則會將交談標示為已延遲並要求來自該服務的路由資訊。

  5. 尋找既不指定服務名稱也不指定 Service Broker 識別碼的路由。

  6. 如果交談指定 Service Broker 識別碼,且如果執行個體包含一或多個資料庫,而這類資料庫含有的服務名稱與在交談中所指定的名稱相符,則會如同包含該服務名稱和 'LOCAL' 網路位址之路由的路由表一樣,路由交談。

  7. 將交談標示為已延遲。

將交談標示為已延遲後,Service Broker 會在逾時期間後再次執行比對程序。請注意,找不到相符的路由不會被視為錯誤。

選擇路由

如果比對程序找到一個以上的相符路由,Service Broker 會從相符的路由中選擇一個路由。為了達成此目的,具有相同 Service Broker 識別碼、服務名稱和網路位址的路由會視為相同。Service Broker 會使用下列程序選擇完全相符的路由。在每個步驟,如果沒有符合步驟指定位址的路由,處理會繼續下一步驟。

  1. 從指定鏡像位址的路由中選擇一個路由。

  2. 從將 'LOCAL' 指定為網路位址的路由中選擇一個路由。如果這個 SQL Server 執行個體不包含符合在交談中指定之名稱的服務,則繼續步驟 3。

  3. 從指定網路位址的路由中選擇一個路由。

  4. 從將 'TRANSPORT' 指定為網路位址的路由中選擇一個路由。

如果 Broker 轉送狀態並非使用中、交談並非源自目前執行個體,且選定路由的位址不為 'LOCAL',則 Service Broker 會卸除訊息。

尋找目的地服務

如上所述,當相符的路由將 'LOCAL' 指定為網路位址時,Service Broker 會將訊息傳遞至目前執行個體中的服務。對於源自執行個體之外的訊息,路由必須在 msdb.sys.routes 中。對於源自執行個體之內的訊息,相符的路由必須在起始交談之資料庫的 sys.routes 資料表中。

當 Service Broker 判定訊息的服務在目前的執行個體中時,Service Broker 必須在該執行個體內找到這個服務。當交談或路由中存在交談的 Service Broker 識別碼時,Service Broker 會將訊息傳遞至由該 Service Broker 識別碼識別的資料庫。

否則,Service Broker 會先在包含交談的資料庫中尋找服務名稱來找出該服務。然後,它會在執行個體的其他資料庫中搜尋服務名稱。Service Broker 會將訊息傳遞到找出的第一個服務。但是,請注意,Service Broker 在執行個體內之其他資料庫中搜尋的順序是未指定的,並且不保證多個交談之間能維持一致。這表示如果執行個體中存在一個以上的目標服務複本,Service Broker 會隨機挑選服務給目標。

其他考量

為了提升可靠性,Service Broker 路由包含防止產生路由迴圈的保護機制。Service Broker 路由還考慮了資料庫鏡像,能以透明方式將交談重新導向至鏡像資料庫的使用中夥伴。

路由迴圈

Service Broker 訊息轉送會追蹤訊息已轉送的次數,以防止產生無休止的路由迴圈。如需詳細資訊,請參閱<Service Broker 訊息轉送>。

如果相符的路由包含解析成目前執行個體的網路位址,則 SQL Server 會將此交談視為源自執行個體之外的交談。Service Broker 會使用 msdb.sys.routes 中的路由,路由交談的訊息。這些訊息的路由與來自執行個體之外訊息的路由相同。特別是,訊息轉送必須為使用中,這樣 Service Broker 才能將訊息轉送至除 'LOCAL' 之外的網路位址。

鏡像位址

當從一組初始相符的路由中選擇一個路由時,具有鏡像位址的路由優先順序最高。但是,當尋找交談的相符路由時,Service Broker 並不會特別考慮鏡像位址。

當 Service Broker 選擇可指定鏡像位址的路由時,而且 Service Broker 先前沒有使用此路由傳遞過訊息時,Service Broker 會將一個要求傳送至兩個位址以判斷哪一個執行個體目前是主體。當 Service Broker 識別出主體時,Service Broker 就會將所有使用此路由的訊息傳送至主體,而不連絡鏡像執行個體。如果無法連上主體,或該執行個體指出它不再是主體,當位於其他位址的 SQL Server 執行個體指出它是新的主體時,Service Broker 會將訊息傳送至配對的其他位址。

如果 Service Broker 無法連上主體,但是夥伴未宣告充當新的主體,則 Service Broker 不會將訊息傳送至此夥伴。Service Broker 會在之後重試主體位址和夥伴位址,直到可以連上主體,或夥伴指出現在它是主體為止。當主體和夥伴可以通訊,但是傳送訊息的執行個體無法連上主體時,Service Broker 透過這種方式可順利傳遞訊息。