針對訊息路由進行疑難解答

本文提供 IoT 中樞 訊息路由常見問題和解決的監視和疑難解答指引。

監視訊息路由

建議您監視與訊息路由和端點相關的 IoT 中樞 計量,以提供所傳送訊息的概觀。 您也可以建立診斷設定,將 IoT 中樞 資源記錄中路由的作業傳送至 Azure 監視器記錄、事件中樞或 Azure 儲存體 以進行自定義處理。 若要深入瞭解如何使用計量、資源記錄和診斷設定,請參閱監視 IoT 中樞。 如需教學課程,請參閱 設定及使用IoT中樞的計量和資源記錄。

如果您想要維護不符合任何路由查詢的訊息,也建議您啟用 後援路由 。 這些可以保留在內建端點,以達到設定的保留天數。

首要問題

以下是訊息路由觀察到的最常見問題。 若要開始進行疑難解答,請按兩下問題以取得詳細步驟。

來自我的裝置的郵件未如預期般路由傳送

若要針對此問題進行疑難解答,請分析下列各項。

此端點的路由計量

路由相關的所有 IoT 中樞 計量都會加上路由前置詞。 您可以結合多個計量的資訊來確定問題的根本原因。 例如,使用計量 路由傳遞 來識別傳遞至端點或捨棄的訊息數目,當訊息不符合任何路由和後援路由的查詢已停用時。 檢查路由延遲計量,觀察訊息傳遞的延遲是否穩定或增加。 成長的延遲可能表示特定端點發生問題,建議您檢查 端點的健康情況。 這些路由計量也有 維度 ,可提供計量的詳細數據,例如端點類型、特定端點名稱,以及訊息未傳遞的原因。

任何作業問題的資源記錄

觀察路由資源記錄以取得路由和端點作業的詳細資訊,或找出錯誤和相關錯誤碼,以進一步了解問題。 例如,記錄檔中的作業名稱 RouteEvaluationError 表示無法評估路由,因為訊息格式有問題。 使用針對特定 作業名稱 提供的秘訣來減輕問題。 當事件記錄為錯誤時,記錄檔也會提供有關評估失敗原因的詳細資訊。 例如,如果作業名稱為 EndpointUnhealthy,403004的錯誤碼表示端點空間不足。

端點的健康情況

使用 REST API 取得端點健康情況 來取得 端點的健康狀態 。 取得 端點健康情況 API 也會提供訊息成功傳送至端點 、上次已知錯誤、上次已知錯誤時間和上次針對此端點進行傳送嘗試的時間的相關信息。 使用針對特定 上次已知錯誤所提供的可能風險降低。

我突然停止在內建端點取得訊息

若要針對此問題進行疑難解答,請分析下列各項。

是否已建立新的路由?

除非建立通向該端點的路由,否則在建立路由後,資料便會停止流向內建端點。 若要確保新增新的路由時,訊息會繼續流向內建端點,請設定事件端點的路由。

後援路由是否已停用?

後援路由會將不符合任何現有路由的任何查詢條件的所有訊息傳送至事件中樞相容的內建事件中樞(messages/events)。 如果訊息路由已開啟,您可以啟用後援路由功能。 如果沒有內建端點的路由,且已啟用後援路由,則只會將不符合路由上任何查詢條件的訊息傳送至內建端點。 此外,如果刪除所有現有的路由,則必須啟用後援路由,才能在內建端點接收所有數據。

您可以使用IoT中樞的 [訊息路由] 刀鋒視窗,在 Azure 入口網站 中啟用或停用後援路由。 您也可以使用適用於 FallbackRoutePropertiesAzure Resource Manager,針對後援路由使用自定義端點。

IoT 中樞 路由端點的最後已知錯誤

取得 REST API 中的端點健康 情況會提供端點的健康情況狀態,以及最後一個已知錯誤,以識別端點狀況不良的原因。 下表列出最常見的錯誤。

上次已知錯誤 描述/發生時 可能的緩和措施
暫時性 發生暫時性錯誤,IoT 中樞 會重試作業。 觀察 路由資源記錄
InternalError 將訊息傳遞至端點時發生錯誤。 這是內部例外狀況,但也觀察 路由資源記錄
未經授權 IoT 中樞 未獲授權將訊息傳送至指定的端點。 驗證端點的 連接字串 為最新狀態。 如果已變更,請考慮更新您的 IoT 中樞。 如果端點使用受控識別,請檢查 IoT 中樞 主體是否具有目標的必要許可權。
扼殺 IoT 中樞 正在將訊息寫入端點時進行節流處理。 檢閱受影響端點的節流限制。 視需要修改端點的組態以相應增加。
Timeout 作業逾時。 重試作業。
找不到 目標資源不存在。 確定目標資源存在。
找不到容器 儲存體 容器不存在。 確定記憶體容器存在。
容器已停用 儲存體容器已停用。 確定記憶體容器已啟用。
MaxMessageSizeExceeded 訊息路由的訊息大小限制為 256Kb。正在路由的訊息大小超過此限制。 使用較少的應用程式屬性或較少的訊息擴充,檢查訊息大小是否可以減少。
PartitioningAndDuplicateDetectionNotSupported 服務總線可能未啟用重複偵測。 從 服務匯流排 停用重複偵測,或考慮使用沒有重複偵測的實體。
SessionfulEntityNotSupported 服務總線可能未啟用會話。 從 服務匯流排 停用會話,或考慮在沒有會話的情況下使用實體。
NoMatchingSubscriptionsForMessage 服務總線主題上沒有可寫入訊息的訂用帳戶。 建立要路由傳送 IoT 中樞 訊息的訂用帳戶。
EndpointExternallyDisabled 端點未處於作用中狀態,因此 IoT 中樞 可以傳送訊息給端點。 讓端點恢復作用中狀態。
DeviceMaximumQueueDepthExceeded 已達到服務總線大小限制。 請考慮從目標事件中樞移除訊息,以允許將新訊息內嵌至事件中樞。

路由資源記錄

以下是記錄在路由資源記錄中的作業名稱和錯誤碼。

作業名稱

作業名稱 層級 描述
UndefinedRouteEvaluation 資訊 無法使用提供條件來評估訊息。 例如,如果訊息中沒有路由查詢條件中的屬性。 深入瞭解 路由查詢語法
RouteEvaluationError 錯誤 因為訊息格式有問題,因此評估訊息時發生錯誤。 例如,如果未在訊息中指定內容編碼或內容類型無效,則會記錄此錯誤。 這些必須在系統屬性設定。
DropdMessage 錯誤 訊息已捨棄且未路由傳送。 這可能是因為訊息不符合任何路由查詢或端點已失效的原因,而且在多次重試之後無法傳遞訊息。 建議您使用 REST API 取得端點健康情況,以取得端點的詳細數據。
EndpointUnhealthy 錯誤 端點尚未接受來自 IoT 中樞 的訊息,且 IoT 中樞 嘗試重新傳送訊息。 建議您透過 REST API 取得端點健康情況來觀察最後一個已知錯誤。
EndpointDead 錯誤 端點一個多小時未接受來自 IoT 中樞 的訊息。 建議您透過 REST API 取得端點健康情況來觀察最後一個已知錯誤。
EndpointHealthy 資訊 端點狀況良好,並從 IoT 中樞 接收訊息。 此訊息不會持續記錄,但只有在端點再次變成狀況良好時才會記錄。 此訊息表示 IoT 中樞 無法將訊息傳送至端點,但端點現在狀況良好。
OrphanedMessage 資訊 訊息不符合任何路由。
InvalidMessage 錯誤 訊息無效,因為端點不相容。 建議您檢查端點的組態。

UndefinedRouteEvaluation、RouteEvaluationErrorOrphanedMessage 作業會進行節流處理,而且每個 IoT 中樞 一分鐘不會再記錄一次。

常見的錯誤碼

錯誤碼 描述
401002 IoT 中樞未經授權存取
413001 訊息太大
403004 超過裝置佇列深度上限
503008 接收連結節流
500000 一般伺服器錯誤
401 未經授權
503 服務無法使用
500001 伺服器錯誤
400103 無效的內容編碼或內容類型
404001 找不到裝置

下一步

如果您需要更多協助,您可以在 Microsoft Q&A 和 Stack Overflow 論壇連絡 Azure 專家。 或者,您可以提出 Azure 支援 事件。 移至 Azure 支援 網站,然後選取 [取得支援]。