你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

管理设备重新连接以创建可复原的应用程序

本文提供高级指南,通过添加设备重新连接策略来帮助设计可复原的应用程序。 本文解释了设备为何断开连接并需要重新连接, 还介绍了可供开发人员用于重新连接已断开连接的设备的特定策略。

导致断开连接的原因

以下是设备与 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 体系结构中心的暂时性故障处理指南

重试模式

以下步骤介绍检测到连接错误时的重试过程:

  1. SDK 检测网络、协议或应用程序中的错误和相关错误。

  2. SDK 使用错误筛选器来确定错误类型并决定是否需要重试。

  3. 如果 SDK 确定了无法恢复的错误,则会停止连接、发送和接收等操作。 SDK 会通知用户。 无法恢复的错误的示例包括身份验证错误和错误终结点错误。

  4. 如果 SDK 确定了可恢复的错误,则会根据指定的重试策略进行重试,直到经过定义的超时时间。 SDK 将默认使用“支持抖动的指数退避”重试策略

  5. 当定义的超时到期时,SDK 会停止尝试连接或发送。 它会通知用户。

  6. SDK 允许用户附加回调以接收连接状态更改。

SDK 通常提供三种重试策略:

  • 带抖动的指数回退:此默认重试策略往往在开始时激进,并随时间推移减缓,直到达到最大延迟。 该设计基于 Azure 体系结构中心的重试指南

  • 自定义重试:对于某些 SDK 语言,可以设计更适合你的方案的自定义重试策略,然后将其注入 RetryPolicy。 C SDK 上无法进行自定义重试,且 Python SDK 当前不支持此功能。 Python SDK 将根据需要重新连接。

  • 不重试:可以将重试策略设置为“不重试”,这将禁用重试逻辑。 SDK 假设连接已建立,尝试进行一次连接并发送一次消息。 此策略通常用于有带宽或成本顾虑的方案。 如果选择此选项,则未能发送的消息将丢失且无法恢复。

重试策略 API

SDK SetRetryPolicy 方法 策略实现 实施指南
C IOTHUB_CLIENT_RESULT IoTHubDeviceClient_SetRetryPolicy See: 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 中心断开连接时:

  1. 使用支持抖动的指数退避延迟函数。
  2. 重新连接到 IoT 中心。

下图总结了重新连接流:

IoT 中心的设备重新连接流示意图。

配有 DPS 的中心的重新连接流

如果使用配有 DPS 的 IoT 中心,请使用以下重新连接策略。

当设备无法连接到 IoT 中心或与 IoT 中心断开连接时,请根据以下情况重新连接:

重新连接场景 重新连接策略
对于允许进行连接重试的错误(HTTP 响应代码 500) 使用支持抖动的指数退避延迟函数。
重新连接到 IoT 中心。
对于指示可以重试,但重新连接已连续 10 次失败的错误 将设备重新预配到 DPS。
对于不允许进行连接重试的错误(HTTP 响应 401、未授权或 403、禁止或 404、未找到) 将设备重新预配到 DPS。

下图总结了重新连接流:

使用 DPS 的 IoT 中心设备重新连接流示意图。

后续步骤

建议执行的后续步骤包括: