Service Broker 通訊協定

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

Service Broker 會使用 Broker 專屬的通訊協定,與遠端 Broker 進行通訊。 Broker 對連接和用戶端連接的一般集區採取分開管理的方式。 為了讓兩個 SQL Server 執行個體可以交換 Service Broker 訊息,每個執行個體都必須要能將 TCP/IP 流量傳送到其他執行個體用於 Service Broker 通訊的連接埠。 Service Broker 依慣例通常會使用連接埠 4022 進行 Broker 對 Broker 之間的通訊。 不過,確切的通訊埠會在建立端點時指定。

通訊協定層

Service Broker 採用分層的方式進行通訊。 每一層都建立於基礎層之上,以協助確保可靠傳遞。 此方法可讓應用程式在不了解遠端服務的位置或不了解 Broker 用於通訊的實體傳輸時運作。 在大多數情況下,這些通訊協定對應用程式是透明的。 然而,了解每個通訊協定層所扮演的角色可能有助於疑難排解應用程式的問題。

Broker 使用的最高層通訊協定是「對話通訊協定」。 對話通訊協定層會處理可靠而循序的訊息傳輸。 對話通訊協定層會產生訊息的序號、產生收條訊息、將訊息傳遞至適當的佇列,以及分段和重新組合訊息。 對話通訊協定則處理對話的驗證和加密。

對話通訊協定使用「相鄰 Broker 通訊協定」來傳輸訊息片段。 相鄰 Broker 通訊協定會處理在兩個 Broker 執行個體之間交換的網路傳輸。

相鄰 Broker 通訊協定使用「傳輸通訊協定」(如 TCP/IP) 在 Broker 與 Broker 之間移動訊息。

對話通訊協定

對話通訊協定管理交談上訊息的精確單次循序 (EOIO) 傳遞模式。 此通訊協定不會描述 Service Broker 訊息在網路上使用的格式。 而是指定可靠交談所需的邏輯步驟。 對話通訊協定能處理可靠傳遞所需的作業,包括產生及處理收條訊息。

對話的每一端都是對話通訊協定層中的端點。目錄檢視 sys.conversation_endpoints 會顯示對話通訊協定端點的相關資訊。 交談的端點存在於交談的存留時間內。

相鄰 Broker 通訊協定

相鄰 Broker 通訊協定層會處理兩個 SQL Server 執行個體之間的通訊機制。 這一層會將每個訊息片段編碼成適於透過網路傳輸的標準格式。 與對話通訊協定層不同,相鄰通訊協定層了解所使用的網路傳輸,並會適當地格式化訊息片段。 實際上,相鄰 Broker 通訊協定層會在對話通訊協定層和傳輸通訊協定層之間提供抽象層。

每個 Service Broker 網路連線都是相鄰通訊協定層中的端點。 動態管理檢視 sys.dm_broker_connections 會顯示 Service Broker 網路連線的相關資訊。 Service Broker 在主動交換訊息時,會維持網路連線。 Service Broker 會在一段短時間沒有任何訊息透過網路連線進行傳送或接收時,關閉該網路連線。

傳輸通訊協定

傳輸通訊協定層處理實際網路傳輸。 此層不在 Service Broker 的範圍內。 例如,傳送至執行於 SQL Server 其他執行個體中之 Broker 的訊息,會使用 TCP/IP 做為傳輸通訊協定層。

Service Broker 端點會設定傳輸通訊協定的選項。 SQL Server 預設不包含 Service Broker 端點。 如需有關建立 Service Broker 端點的詳細資訊,請參閱操作說明:啟動 Service Broker 網路 (Transact-SQL)

Service Broker 訊息處理

Service Broker 使用兩種不同類別的訊息。 「循序訊息」是必須精確單次循序傳遞至應用程式的訊息。 「非循序訊息」是可以立即處理的訊息,不論訊息到達的順序為何。

Service Broker 會對所有使用者定義的訊息類型、結束對話訊息和應用程式所建立的錯誤訊息,使用循序訊息。 每個循序訊息都有序號。 產生訊息的執行個體會建立訊息序號,並將序號指派給訊息。 接收 Broker 使用訊息序號對其提供給應用程式的訊息進行排序。 應用程式收到對話時,一律會從最低的序號開始接收訊息。 Service Broker 也會使用訊息序號,來偵測重複的訊息。 當對話通訊協定層在同一對話上收到具有相同序號的兩個訊息時,對話通訊協定層會將這兩個訊息視為重複並會捨棄一個。

Service Broker 會對 Service Broker 所建立的專用收條訊息和錯誤訊息,使用非循序的訊息。 Service Broker 在傳遞非循序訊息時,不會採取任何特殊的預防措施。 但請注意,Service Broker 會建立非循序訊息來回應內送訊息。 因此,如果遺失非循序訊息,則傳送者會重試原始訊息;然後,接收者會產生另一個非循序訊息。

訊息分段

Service Broker 會將外寄訊息分割成數個片段,並將內送片段組合成原始訊息。 對於較小的訊息,整個訊息會包含在一個片段中。 Service Broker 對於較大的訊息,會建立許多片段。

將訊息分段有數個優點。 在透過相對較慢且不可靠的網路 (如「廣域網路 (WAN)」) 進行通訊時,以較小的片段傳送較大的訊息可提升整體速度和可靠性。 如果訊息的片段遺失,通訊協定僅會重新傳輸一個片段,而不是完整的訊息。 分割大型訊息也可減少將小型訊息傳送到目的地所需的時間。 Service Broker 可以在大型訊息片段之間,傳送包含完整小型訊息的片段。 這會略微減慢大訊息的速度,以便減少小訊息等待傳輸的時間。

重新組合訊息時,部分訊息會儲存在目的地佇列中。 如果目的地佇列無法使用,則訊息會儲存在傳輸佇列中。 應用程式無法接收部份訊息。 部份訊息的 status 資料行,設定為 2 (停用)。 此值也用於未按順序接收的訊息。

訊息應答

Service Broker 會確認每個收到的訊息。 收條可確認一或數個訊息片段。 在可能的情況下,收條會包含在同一個對話在傳回之訊息的標頭中。 如果沒有其他準備要傳送的訊息,Service Broker 會傳回專用收條訊息。 收條訊息完全由 Service Broker 處理;使用 Service Broker 的應用程式不會接收這些訊息。

傳送者會保留接收者尚未確認的訊息片段。 如果在系統定義的等待時間內未收到收條,傳送者會再次傳送該訊息片段。 如果等待期間仍未收到收條,則 Service Broker 會以呈指數增加下次重試前的等待時間,最多可達最長等待時間。 重試的初始等待時間為幾秒鐘。 而最大等待時間約為一分鐘。 請注意,等待時間可能會不精確,因為等待時間過期後的幾秒鐘內,可能不會重試訊息片段,這要視網路流量和 SQL Server 執行個體中的其他活動而定。

如果收條遺失或延遲,接收者可能會收到重複的訊息。 在此情況下,接收者會確認重複的訊息,但不會將重複的訊息傳遞至佇列。

Service Broker 使用訊息收條來提供可靠的訊息傳送,而無需使用分散式交易。 接收者只有在將該訊息或訊息片段加入至佇列之後,才會傳送收條。 傳送者會將訊息保留在傳輸佇列中,直到收到該訊息的收條為止。 雖然傳送者和接收者從不共用交易,但是通訊協定可保證傳送者不會從傳輸佇列移除訊息,直到接收者成功接收訊息為止。

訊息完整性檢查

Service Broker 用於傳輸訊息的格式,其包含訊息完整性檢查,以判斷傳送的訊息在傳輸期間,是否有所改變或已損毀。

訊息完整性檢查是該訊息內容的 MD5 簽章。 SQL Server 會利用該訊息的工作階段金鑰來加密簽章,同時在訊息標頭附上該簽章。

訊息的目的地會解密訊息,然後將訊息中的簽章與根據接收之實際內容計算的新簽章相比較。 如果簽章不符,則訊息已在傳輸期間遭損毀或竄改。 該訊息就無法通過訊息的完整性檢查。 SQL Server 會捨棄該訊息,且不會對傳送者確認訊息。 Broker:Corrupted Message 事件類別會在訊息的完整性檢查失敗時,回報資訊。

Service Broker 傳輸物件

Service Broker 傳輸物件是記憶體內物件,可管理及記錄對話的訊息傳輸狀態。 每個交談端點都有一個傳輸物件。

進行下列動作時,對話會要求傳輸物件:

  • 透過傳輸佇列傳送訊息。 其中包括下列項目:

    • 傳送到資料庫引擎遠端執行個體的所有訊息

    • 如果無法將訊息直接插入目的地佇列,則是將佇列傳送到本機執行個體的訊息

  • 接收遠端訊息或來自本機傳輸佇列的訊息。

對話要求傳輸物件時,會首次建立傳輸物件。 Service Broker 會針對來自該對話的後續要求,使用相同的傳輸物件。 每次 Service Broker 必須記錄對話的訊息傳輸狀態變更時,就會修改傳輸物件。 傳輸物件大約為 1 KB。

為釋出記憶體,Service Broker 會定期將非使用中傳輸物件的批次,儲存在 tempdb 工作資料表中。 第一次在記憶體中修改傳輸物件時,會將它標示為「中途」。 在工作資料表中排清傳輸物件前,該傳輸物件仍會標示為「中途」。

傳輸物件不會用於傳送或接收可以直接插入到目的地佇列的本機訊息。

網路通訊流程

下圖呈現兩個 SQL Server 執行個體之間 Service Broker 網路通訊的大略情況。

Broker network communication between two instances

請注意,交談是永續性的邏輯連接。 交談可以在任何一段時間發生,且在這段時間內,交談可以使用任意個數的網路連接。

兩個 Service Broker 端點之間,會進行網路連線。 這些連接使用 TCP/IP。 如果連線有一小段時間處於非使用中,SQL Server 就會關閉該網路連線。

為傳遞訊息,Service Broker 會將訊息保留在傳送訊息之資料庫的傳輸佇列中。 接收者會將訊息直接傳遞至目的地服務的佇列。 如果該佇列為 OFF,則訊息會暫時保留在接收資料庫的傳輸佇列中。 作業中並不涉及傳送服務的佇列, 而裝載接收服務之資料庫的傳輸佇列僅會在目的地佇列為 OFF 時涉及。

另請參閱