對訊息路由進行疑難排解
本文提供 IoT 中樞訊息路由的常見問題和解決方法的監視與疑難排解指引。
監視訊息路由
建議您監視與訊息路由和端點相關的 IoT 中樞計量,以概略了解傳送的訊息。 您也可以建立診斷設定,以將 IoT 中樞資源記錄中的路由的作業傳送至 Azure 監視器記錄、事件中樞或 Azure 儲存體,進行自訂處理。 若要深入了解如何使用計量、資源記錄和診斷設定,請參閱監視 IoT 中樞。 如需教學課程,請參閱透過 IoT 中樞來設定及使用計量和資源記錄。
如果您想要維護不符合任何路由之查詢的訊息,也建議您啟用後援路由。 這些訊息在已設定的保留期天數內可保留在內建端點中。
首要問題
以下是訊息路由最常見出現的問題。 若要開始進行疑難排解,請選取問題以取得詳細步驟。
我的裝置的訊息未按預期的方式路由傳送
若要對此問題進行疑難排解,請分析下列資訊。
此端點的路由計量
所有與路由相關的 IoT 中樞計量都會加上 Routing 前置詞。 您可以結合多個計量的資訊來確定問題的根本原因。 例如,使用計量 [路由傳遞] 可識別已傳遞至某個端點,或與任何路由的查詢不符且後援路由已停用而捨棄的訊息數。 查看 [路由延遲] 計量,可觀察訊息傳遞的延遲是否穩定或增加中。 增長的延遲可能表示特定端點發生問題,建議您檢查端點的健康情況。 這些路由計量也有維度,可提供計量的詳細資料,例如端點類型、特定端點名稱,以及訊息未傳遞的原因。
任何作業問題的資源記錄
觀察路由資源記錄,可取得路由和端點作業的詳細資訊,或識別錯誤和相關錯誤碼以進一步了解問題。 例如,記錄中的作業名稱 RouteEvaluationError 表示無法評估路由,因為訊息格式有問題。 使用針對特定作業名稱所提供的提示來減輕問題。 當事件記錄為錯誤時,記錄也會提供有關評估失敗原因的詳細資訊。 例如,如果作業名稱為 EndpointUnhealthy,403004 的錯誤碼表示端點空間不足。
端點的健康情況
使用 REST API 取得端點健康情況 (部分機器翻譯),取得端點的健全狀態。 此 API 也會提供關於上次訊息成功傳送至端點、上一個已知錯誤、上一個已知錯誤時間,和上次針對此端點進行傳送嘗試之時間的資訊。 使用針對特定上一個已知錯誤提供的可能緩和措施。
在內建端點取得訊息的程序突然停止
若要對此問題進行疑難排解,請分析下列資訊。
是否建立了新路由?
除非建立通向該端點的路由,否則在建立路由後,資料便會停止流向內建端點。 若要確保在新增路由後訊息會繼續流向內建端點,請設定事件端點的路由。
後援路由是否已停用?
後援路由會將與現有路由查詢條件不符的所有訊息,傳送至與事件中樞相容的內建事件中樞 (訊息/事件)。 如果訊息路由已開啟,您可以啟用後援路由功能。 如果沒有通到內建端點的路由且後援路由已啟用,則只有和任何路由上的查詢條件不相符的訊息會被傳送到內建端點。 此外,如果刪除了所有現有的路由,則必須啟用後援路由以接收內建端點中的所有資料。
您可以使用 IoT 中樞的 [訊息路由] 刀鋒視窗,在 Azure 入口網站中啟用或停用後援路由。 您也可以對於 FallbackRouteProperties 使用 Azure 資源管理員來使用後援路由的自訂端點。
IoT 中樞路由端點的上一個已知錯誤
REST API 中的取得端點健康情況會提供端點的健全狀態和上一個已知錯誤,用以識別端點狀況不良的原因。 此資料表列出最常見的錯誤。
上一個已知錯誤 | 描述/發生時間 | 可能的緩和措施 |
---|---|---|
暫時性 | 發生暫時性錯誤,IoT 中樞將重試作業。 | 觀察路由資源記錄。 |
InternalError | 將訊息傳遞至端點時發生錯誤。 | 此錯誤為內部例外狀況,但也會觀察路由資源記錄。 |
未經授權 | IoT 中樞未獲得將訊息傳送至指定端點的授權。 | 驗證端點的連接字串是最新的。 若有所變更,請考慮更新您的 IoT 中樞。 如果端點使用受控識別,請確認 IoT 中樞主體具有目標的必要權限。 |
調整執行速度 | 將訊息寫入至端點時,IoT 中樞會進行節流。 | 檢閱受影響端點的節流限制。 修改端點的設定以視需要擴大。 |
Timeout | 作業逾時。 | 重試作業。 |
找不到 | 目標資源不存在。 | 確定目標資源存在。 |
找不到容器 | 儲存體容器不存在。 | 確定儲存體容器存在。 |
容器已停用 | 儲存體容器已停用。 | 確定儲存體容器已啟用。 |
MaxMessageSizeExceeded | 訊息路由有 256 Kb 的訊息大小限制。 正在路由的訊息大小超過此限制。 | 使用較少的應用程式屬性或較少訊息擴充,檢查訊息大小是否可以降低。 |
PartitioningAndDuplicateDetectionNotSupported | 服務匯流排可能未啟用重複偵測。 | 停用服務匯流排的重複偵測,或考慮使用沒有重複偵測的實體。 |
SessionfulEntityNotSupported | 服務匯流排可能未啟用工作階段。 | 停用來自服務匯流排的工作階段,或考慮使用沒有工作階段的實體。 |
NoMatchingSubscriptionsForMessage | 沒有要撰寫服務匯流排主題之訊息的訂用帳戶。 | 為要路由傳送到的 IoT 中樞訊息建立訂用帳戶。 |
EndpointExternallyDisabled | 端點未處於作用中狀態,因此 IoT 中樞可對其傳送訊息。 | 讓端點能夠恢復其作用中狀態。 |
DeviceMaximumQueueDepthExceeded | 已達到服務匯流排大小限制。 | 請考慮從目標事件中樞移除訊息,讓新訊息能夠擷取至事件中樞。 |
路由資源記錄
以下是在路由資源記錄中記錄的作業名稱和錯誤碼。
作業名稱
作業名稱 | 層級 | 描述 |
---|---|---|
UndefinedRouteEvaluation | 資訊 | 無法使用給定的條件來評估訊息。 例如,如果路由查詢條件中的屬性不存在於訊息中。 深入了解路由查詢語法。 |
RouteEvaluationError | 錯誤 | 評估訊息時發生錯誤,因為訊息格式有問題。 例如,如果未指定內容編碼或內容類型在訊息中無效,就會記錄此錯誤。 這些項目必須設定於系統屬性中。 |
DroppedMessage | 錯誤 | 訊息已卸除且未路由傳送。 這可能是因為訊息不符合任何路由查詢或端點失效,且訊息在多次重試之後無法傳遞。 建議您使用 REST API 取得端點健康情況來取得端點的詳細資料。 |
EndpointUnhealthy | 錯誤 | 端點尚未接受來自 IoT 中樞的訊息,且 IoT 中樞正在嘗試重新傳送訊息。 建議您透過 REST API 取得端點健康情況來觀察最新的已知錯誤。 |
EndpointDead | 錯誤 | 端點已有一個多小時未接受來自 IoT 中樞的訊息。 建議您透過 REST API 取得端點健康情況來觀察最新的已知錯誤。 |
EndpointHealthy | 資訊 | 端點狀況良好,並從 IoT 中樞接收訊息。 此訊息不會持續記錄,而只會在端點恢復良好狀況時記錄。 此訊息表示 IoT 中樞無法將訊息傳送至端點,但端點目前狀況良好。 |
OrphanedMessage | 資訊 | 訊息不符合任何路由。 |
InvalidMessage | 錯誤 | 訊息因與端點不相容而無效。 建議檢查端點的設定。 |
作業 UndefinedRouteEvaluation、RouteEvaluationError 和 OrphanedMessage 受到節流,每個 IoT 中樞最多每分鐘記錄一次。
常見的錯誤碼
錯誤碼 | 描述 |
---|---|
401002 | Iot 中樞未經授權的存取 |
413001 | 訊息太大 |
403004 | 已超過裝置的佇列深度上限 |
503008 | 接收連結已節流 |
500000 | 一般伺服器錯誤 |
401 | 未經授權 |
503 | 服務無法使用 |
500001 | 伺服器錯誤 |
400103 | 無效的內容編碼或內容類型 |
404001 | 找不到裝置 |
下一步
如果您需要更多協助,可以在 Microsoft Q&A 和 Stack Overflow 論壇上連絡 Azure 專家。 或者,您可以提出 Azure 支援事件。 請移至 Azure 支援網站,然後選取 [取得支援]。