Share via


疑難排解路由和訊息傳遞

此章節提供可更正與路由和訊息傳遞相關之常見問題的建議。

技術:診斷訊息傳遞

如果訊息沒有在兩個服務之間順利傳遞,請使用 ssbdiagnose 公用程式來產生交談的執行階段報表。此執行階段報表將顯示交談作業遇到的任何錯誤。如果遇到了錯誤,ssbdiagnose 也會分析服務之間的組態,並報告它找到的任何組態問題。如需詳細資訊,請參閱<ssbdiagnose 公用程式>。

問題:保留在傳輸佇列內的訊息

請確定已在資料庫內啟動 Service Broker 訊息傳遞。sys.databasesis_broker_enabled 資料行會顯示是否已啟動 Broker 訊息傳遞,如下列範例所示:

SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;

可以停用 Broker 訊息傳遞,以防止將訊息傳遞至錯誤的資料庫。如需有關 Service Broker 訊息傳遞的詳細資訊,請參閱<管理 Service Broker 識別>。如需有關如何啟動 Service Broker 訊息傳遞的詳細資訊,請參閱<如何:啟動資料庫中的 Service Broker 訊息傳遞 (Transact-SQL)>。

如果 Service Broker 訊息傳遞為使用中狀態,請檢查 sys.transmission_queue 目錄檢視的 transmission_status 資料行中的訊息。常見的錯誤訊息包括下列各項:

訊息

描述

服務沒有路由。

Service Broker 找不到指定之服務的路由。

無法連上目標 Service Broker。

Service Broker 無法將訊息傳遞至目標 Service Broker。

傳輸層無法使用。

執行個體中不存在 Service Broker 端點,或 Service Broker 端點未成功啟動。

目標佇列已停用。

目的地服務使用之佇列的 STATUS 選項設定為 OFF。Service Broker 不會將新的訊息加入 STATUS 為 OFF 的佇列中。

接收資料時發生錯誤:「10054(現有的連線已被遠端主機強制關閉。)」。

交談的遠端接受了 TCP/IP 連接,但在允許訊息傳送之前關閉了連接。

(無)

Service Broker 尚未嘗試傳送訊息。如果 enqueue_time 資料行顯示此訊息已經位於佇列中一段長時間,表示資料庫可能沒有啟動 Service Broker 訊息傳遞。

問題:路由存在,但傳輸狀態顯示服務沒有路由

這個問題的最常見原因如下:

  • 當沒有任何可成功傳遞訊息的路由存在時,SEND 陳述式建立了訊息。

  • 雖然之後建立了路由,但是 Service Broker 尚未嘗試重新傳送訊息。

如需有關重試的詳細資訊,請參閱<Service Broker 路由和網路>。

請確定訊息中指定的服務名稱,與路由中指定的服務名稱完全相符。Service Broker 會使用逐一位元組的二進位比較方式來比對服務名稱。如果指定服務名稱的路由存在,您就可以透過執行下列查詢,比較這些名稱:

SELECT N'No Exact Match' = tq.to_service_name
FROM sys.transmission_queue AS tq
WHERE NOT EXISTS
    (SELECT remote_service_name
     FROM sys.routes AS routes
     WHERE tq.to_service_name = routes.remote_service_name) ;

[!附註]

某些服務名稱可能會顯示在結果集中,即使它們與路由不相符也一樣。沒有指定服務名稱 (remote_service_name = NULL) 的路由與搭配任何訊息使用的服務名稱都相符。

如需有關 Service Broker 路由的詳細資訊,請參閱<Service Broker 路由>。

如果訊息指定了 Broker 執行個體識別碼,請確認路由指定了相同的 Broker 執行個體識別碼,或路由完全沒有指定 Broker 執行個體識別碼。

檢查路由是否尚未過期。sys.routes 目錄檢視的存留時間資料行包含路由的到期日和時間。

問題:傳輸狀態顯示無法連上目標 Service Broker

目的地不接受訊息。這可能表示指定的服務名稱與目的地 SQL Server 執行個體所主控之服務的名稱不符。它也可能表示目的地沒有包含服務的路由。若要疑難排解此問題,請檢查目的地的路由和服務組態。

問題:傳輸狀態顯示傳輸層無法使用

請確認 Service Broker 端點存在。如果沒有任何端點存在,請建立一個端點。如果端點已存在,請確認端點的狀態是否為 STARTED。如需詳細資訊,請參閱<Service Broker 端點>。如需有關如何建立端點的詳細資訊,請參閱<如何:啟動 Service Broker 網路 (Transact-SQL)>。

問題:傳輸狀態顯示「遠端主機已強制關閉一個現存的連線」

可能未正確設定傳輸安全性,或路由的 TCP/IP 位址所指定之通訊埠正由 Service Broker 之外的其他服務使用。

[!附註]

在路由中指定的通訊埠必須對應至 Database Engine 遠端執行個體上之 Service Broker 端點所使用的通訊埠。Service Broker 會使用 Service Broker 通訊協定來傳輸訊息,而非用來傳輸 Transact-SQL 批次和結果的表格式資料流通訊協定。因此,Service Broker 端點所使用的通訊埠與用來傳輸 Transact-SQL 的通訊埠不同。

檢查 Service Broker 端點組態,以確定兩個執行個體具有相容的網路安全性設定。如果一個執行個體的 Service Broker 端點指定 REQUIRED 或 ENABLED,則另一執行個體的 Service Broker 端點無法指定 NONE。

檢查 Service Broker 傳輸安全性的憑證、使用者和權限。如需詳細資訊,請參閱<Service Broker 傳輸安全性>。