管理裝置重新連線以建立復原的應用程式
本文提供高階指引,可藉由新增裝置重新連線策略來協助您設計復原應用程式。 其會說明裝置為何中斷連線並需要重新連線。 而且其會描述開發人員可用於重新連線已中斷連線之裝置的特定策略。
造成中斷連線的原因
以下是裝置與 IoT 中樞中斷連線最常見的原因:
- 已過期的 SAS 權杖或 X.509 憑證。 裝置的 SAS 權杖或 X.509 驗證憑證已過期。
- 網路中斷。 裝置與網路的連線中斷。
- 服務中斷。 Azure IoT 中樞服務發生錯誤或暫時無法使用。
- 服務重新設定。 重新設定 IoT 中樞服務設定之後,可能會導致裝置需要重新佈建或重新連線。
為何您需要重新連線策略
請務必制定重新連線裝置的策略,如下列各區段述。 如果沒有重新連線策略,您可能會發現解決方案效能、可用性和成本受到了負面影響。
大量重新連線嘗試可能會導致 DDoS
每秒大量連線嘗試可能會導致類似拒絕服務的攻擊 (DDoS) 的情況。 此案例與數百萬計的大型裝置機群相關。 該問題可能會超出擁有機群的租用戶範圍,並影響整個縮放單位。 由於需要擴增,DDoS 可能會導致 Azure IoT 中樞資源的成本大幅增加。DDoS 也可能會因為資源耗盡而損害解決方案的效能。 更糟的情況下,DDoS 可能會導致服務中斷。
中樞失敗或重新設定可能會中斷許多裝置的連線
IoT 中樞發生失敗,或在 IoT 中樞上重新設定服務設定之後,裝置可能已中斷連線。 為了進行適當的容錯移轉,已中斷連線的裝置需要重新佈建。 若要深入了解容錯移轉選項,請參閱 IoT 中樞高可用性和災害復原。
重新布建許多裝置可能會增加成本
裝置與 IoT 中樞中斷連線之後,最佳解決方案是重新連線裝置,而不是重新佈建裝置。 如果您使用 IoT 中樞 搭配 DPS,DPS 會以每個布建成本為單位。 如果您在 DPS 上重新佈建許多裝置,則會增加 IoT 解決方案的成本。 若要深入瞭解 DPS 布建成本,請參閱 IoT 中樞 DPS 定價。
用於復原的設計
IoT 裝置通常仰賴非連續或不穩定的網路連線 (例如 GSM 或衛星網路)。 當裝置與雲端式服務互動時,可能會因間歇性的服務中斷以及基礎結構層級或暫時性的故障而發生錯誤。 在裝置上執行的應用程式需要管理用於連線、重新連線以及傳送與接收訊息重試邏輯的機制。 此外,重試策略需求主要取決於裝置的 IoT 情節、內容和功能。
Azure IoT 中樞裝置 SDK 的目標是要簡化雲端到裝置以及裝置到雲端的連線和通訊。 這些 SDK 可提供連線至 Azure IoT 中樞的可靠方式,以及傳送與接收訊息的全方位選項集。 開發人員也可以修改現有的實作,以針對特定情節自訂更適合的重試策略。
下列 IoT 中樞裝置 SDK 可提供支援連線能力與可靠傳訊的相關 SDK 功能。 如需詳細資訊,請參閱 API 文件或特定 SDK:
下列區段會描述支援連線的 SDK 功能。
連線與重試
此節會概述管理連線時可用的重新連線和重試模式。 文中會詳細說明在您的裝置應用程式中使用不同重試原則的實作指導,並列出裝置 SDK 中的相關 API。
錯誤模式
連線失敗可能會發生在多個層級:
網路錯誤:中斷連線的通訊端和名稱解析錯誤
HTTP、AMQP 和 MQTT 傳輸的通訊協定層級錯誤:中斷的連結或已過期的工作階段
因本機錯誤 (例如,無效的認證) 或服務行為 (例如,超出配額或節流) 而產生的應用程式層級錯誤
裝置 SDK 可偵測這三種層級的錯誤。 不過,裝置 SDK 不會偵測及處理 OS 相關錯誤和硬體錯誤。 SDK 設計的基礎是來自 Azure 架構中心的暫時性錯誤處理指引。
重試模式
下列步驟說明偵測到連線錯誤時的重試程序:
SDK 偵測到網路、通訊協定或應用程式中的錯誤和相關錯誤。
SDK 使用錯誤篩選來判斷錯誤類型,並決定是否需要重試。
如果 SDK 識別出無法復原的錯誤,連線、傳送和接收之類的作業就會停止。 SDK 會通知使用者。 舉例來說,無法復原的錯誤包括驗證錯誤和不正確的端點錯誤。
如果 SDK 識別出可復原的錯誤,則會根據指定的重試原則進行重試,直到定義的逾時結束為止。 SDK 預設會使用具有隨機跳躍的指數輪詢重試原則。
當定義的逾時到期時,SDK 就會停止嘗試連線或傳送。 它會通知使用者。
SDK 允許使用者附加回撥,以接收連線狀態變更。
SDK 通常提供三個重試原則:
含隨機跳躍的指數輪詢:此預設重試原則通常會在一開始積極執行,然後隨著時間減緩,直到達到延遲上限。 設計的基礎是 Azure Architecture Center 的重試指引。
自訂重試:針對某些 SDK 語言中,您可以設計您的案例較為適用的自訂重試原則,然後將其插入 RetryPolicy 中。 C SDK 上無法使用自定義重試,Python SDK 目前不支援此重試。 Python SDK 會視需要重新連線。
沒有重試:您可以將重試原則設定為「無重試」,這會停用重試邏輯。 假設連線已建立,SDK 會嘗試連線一次,並傳送訊息一次。 此原則通常用於在頻寬或成本方面有所顧慮的情節。 如果選擇此選項,無法傳送的訊息將會遺失,而且無法復原。
重試原則 API
SDK | SetRetryPolicy 方法 | 原則實作 | 實作指引 |
---|---|---|---|
C | IOTHUB_CLIENT_RESULT IoTHubDeviceClient_SetRetryPolicy | 請參閱: IOTHUB_CLIENT_RETRY_POLICY | C 實作 |
Java | SetRetryPolicy | 預設值:ExponentialBackoffWithJitter 類別 自定義: 實作 RetryPolicy 介面 不重試:NoRetry 類別 |
Java 實作 |
.NET | DeviceClient.SetRetryPolicy | 預設值:ExponentialBackoff 類別 自訂:實作 IRetryPolicy 介面 不重試:NoRetry 類別 |
C# 實作 |
節點 | setRetryPolicy | 預設值:ExponentialBackoffWithJitter 類別 自訂:實作 RetryPolicy 介面 不重試:NoRetry 類別 |
Node 實作 |
Python | 目前不支援 | 目前不支援 | 內建連線重試:預設會以固定的 10 秒間隔重試已中斷的連線。 如有需要,可停用此功能,而且可設定間隔。 |
中樞重新連線流程
如果您只使用 IoT 中樞,而不使用 DPS,請使用下列重新連線策略。
當裝置無法連線到 IoT 中樞,或與 IoT 中樞中斷連線時:
- 使用具有隨機跳躍延遲功能的指數輪詢。
- 重新連線到 IoT 中樞。
下圖摘要說明重新連線流程:
DPS 重新連線流程的中樞
如果您要將 IoT 中樞和 DPS 一起使用,則請使用下列重新連線策略。
當裝置無法連線到 IoT 中樞,或與 IoT 中樞 中斷連線時,請根據下列情況重新連線:
重新連線案例 | 重新連線策略 |
---|---|
若發生允許連線重試的錯誤 (HTTP 回應碼 500) | 使用具有隨機跳躍延遲功能的指數輪詢。 重新連線到 IoT 中樞。 |
針對指出重試可能的錯誤,但重新連線已連續 10 次失敗 | 重新佈建裝置至 DPS。 |
若發生不允許重試連線的錯誤 (HTTP 回應 401、未經授權或 403、禁止或 404、找不到) | 重新佈建裝置至 DPS。 |
下圖摘要說明重新連線流程:
下一步
建議的後續步驟包括: