Service Broker 路由

適用於:SQL ServerAzure SQL 受控執行個體

此主題說明 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 識別出主體時,就會將所有使用此路由的訊息傳送至主體,而不連絡鏡像執行個體。 如果無法連線到主體,或該執行個體指出本身不再是主體,而位於另一個位址上的 SQL Server 執行個體指出本身是新的主體,Service Broker 就會傳送訊息給配對的另一個位址。

如果 Service Broker 無法連線到主體,但夥伴未宣告為新主體,Service Broker 就不會傳送訊息給夥伴。 Service Broker 接下來會重試主體位址和夥伴位址,直到可連線到主體,或夥伴指出本身現在已是主體。 當主體和夥伴可以通訊,但是傳送訊息的執行個體無法連線到主體時,透過這種方式 Service Broker 可順利傳遞訊息。

另請參閱