疑難排解路由和訊息傳遞
此章節提供可更正與路由和訊息傳遞相關之常見問題的建議。
技術:診斷訊息傳遞
如果訊息沒有在兩個服務之間順利傳遞,請使用 ssbdiagnose 公用程式來產生交談的執行階段報表。此執行階段報表將顯示交談作業遇到的任何錯誤。如果遇到了錯誤,ssbdiagnose 也會分析服務之間的組態,並報告它找到的任何組態問題。如需詳細資訊,請參閱<ssbdiagnose 公用程式>。
問題:保留在傳輸佇列內的訊息
請確定已在資料庫內啟動 Service Broker 訊息傳遞。sys.databases 的 is_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 傳輸安全性>。