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

配置磁盘支持的消息缓冲区行为

重要

此设置要求修改 Broker 资源。 它仅在初始部署时使用 Azure CLI 或 Azure 门户进行配置。 如果需要 Broker 配置更改,则需要新的部署。 若要了解详细信息,请参阅自定义默认代理

磁盘支持的消息缓冲区功能用于高效管理分布式 MQTT 代理中的消息队列。 其优势包括:

  • 高效队列管理:在 MQTT 代理中,每个订阅服务器都与消息队列相关联。 订阅服务器的消息处理速度会直接影响队列的大小。 如果订阅服务器处理消息速度慢,或者如果消息断开连接但请求 MQTT 持久会话,队列可能会增大到超过可用内存。
  • 持久会话的数据保留:磁盘支持的消息缓冲区功能可确保队列超出可用内存时无缝缓冲到磁盘。 此功能可防止数据丢失并支持 MQTT 持久会话,从而支持订阅服务器在重新连接时恢复其会话,且其消息队列保持不变。 磁盘用作临时存储并充当内存溢出。 写入磁盘的数据不是持久数据,并且在 Pod 退出时会丢失。 如果每个后端链中至少有一个 Pod 正常运行,则整个代理将不会丢失任何数据。
  • 处理连接问题:云连接器被视为具有持久会话的订阅服务器,如果它们由于网络断开连接而无法与 Azure 事件网格 MQTT 代理等外部系统通信,则可能会遇到连接问题。 在这种情况下,消息 (PUBLISH) 会累积。 在恢复连接之前,MQTT 代理可智能地将这些消息缓冲到内存或磁盘,从而确保消息完整性。

默认情况下,磁盘支持的消息缓冲区功能处于禁用状态。 在这种情况下,消息保留在内存中,当读取器池或暂存池达到由订阅服务器队列限制定义的限制时,将对客户端施加支持压力。

配置磁盘支持的消息缓冲区对于维护强大而可靠的消息队列系统至关重要,尤其是在消息处理速度和连接性至关重要的情况下。

注意

MQTT 代理会将从客户端接收到的数据原样写入磁盘,而不进行额外的加密。 保护磁盘对于保护代理存储的数据至关重要。

配置选项

若要配置磁盘支持的消息缓冲区,请编辑“代理”资源中的 diskBackedMessageBuffer 部分。 目前,仅在使用 az iot ops create 命令部署 Azure IoT 操作时通过使用 --broker-config-file 标志才支持此配置。

要开始使用,请通过遵循 DiskBackedMessageBuffer API 参考来准备代理配置文件。

例如,最简单的配置只涉及指定最大大小。 在这种情况下,将装载 emptyDir。 值 maxSize 用作 emptyDir 卷的大小限制。 但由于 emptyDir 卷的限制,此选项是最不被推荐的选项。

{
  "diskBackedMessageBuffer": {
    "maxSize": "<SIZE>"
  }
}

若要获取更好的磁盘支持的消息缓冲区配置,请指定临时卷或永久性卷声明,以便为消息缓冲区装载专用存储卷。 例如:

{
  "diskBackedMessageBuffer": {
    "maxSize": "<SIZE>",
    "ephemeralVolumeClaimSpec": {
      "storageClassName": "<NAME>",
      "accessModes": [
        "<MODE>"
      ]
    }
  }
}
{
  "persistentVolumeClaimSpec": {
    "maxSize": "<SIZE>",
    "ephemeralVolumeClaimSpec": {
      "storageClassName": "<NAME>",
      "accessModes": [
        "<MODE>"
      ]
    }
  }
}

通过调整以下设置来定制代理消息缓冲区选项:

  • 配置卷:指定卷声明模板,为消息缓冲区装载专用存储卷。
  • 选择存储类:使用 storageClassName 属性定义所需的存储类。
  • 定义访问模式:确定卷所需的访问模式。 有关详细信息,请参阅永久性卷访问模式

使用以下部分来了解不同的卷模式:

永久性卷和临时卷通常由相同的存储类提供。 如果这两个选项都可用,请选择临时卷。 临时卷需要 Kubernetes 1.23 或更高版本。

提示

指定临时卷声明 (EVC) 或永久性卷声明 (PVC) 模板时,可以使用所选的存储类,这会提高一些部署方案的灵活性。 例如,使用 PVC 模板预配的永久性卷 (PV) 会显示在 kubectl get pv 等命令中,这对于检查群集状态非常有用。

如果 Kubernetes 节点缺少足够的本地磁盘空间来缓冲消息,请使用提供网络存储(如 Azure Blob 存储)的存储类。 但通常最好使用具有较小 maxSize 值的本地磁盘,因为消息缓冲区可受益于快速访问,并且不需要持续性。

使用磁盘支持的消息缓冲区部署 IoT 操作

要使用磁盘支持的消息缓冲区,请使用带有 --broker-config-file 标志的 az iot ops create 命令部署 IoT 操作。 请参阅以下命令。 (为简洁起见,省略了其他参数。)

az iot ops create ... --broker-config-file <FILE>.json

部署后无法更改此设置。 要更改磁盘支持的消息缓冲区配置,请重新部署 IoT 操作实例。

临时卷

临时卷是消息缓冲区的首选选项。

对于临时卷,请按照有关存储提供程序的注意事项部分中的建议进行操作。

ephemeralVolumeClaimSpec 属性的值用作后端链 StatefulSet 规范中卷的 ephemeral.volumeClaimTemplate.spec 属性。

例如,若要使用容量为 1 GB 的临时卷,请在“代理”资源中指定以下参数:

{
  "diskBackedMessageBuffer": {
    "maxSize": "1G",
    "ephemeralVolumeClaimSpec": {
      "storageClassName": "foo",
      "accessModes": [
        "ReadWriteOnce"
      ]
    }
  }
}

永久性卷

永久性卷是继临时卷之后消息缓冲区的次优推荐选项。

对于永久性卷,请按照有关存储提供程序的注意事项部分中的建议进行操作。

persistentVolumeClaimSpec 属性的值用作后端链 StatefulSet 规范的 volumeClaimTemplates.spec 属性。

例如,若要使用容量为 1 GB 的永久性卷,请在“代理”资源中指定以下参数:

{
  "diskBackedMessageBuffer": {
    "maxSize": "1G",
    "persistentVolumeClaimSpec": {
      "storageClassName": "foo",
      "accessModes": [
        "ReadWriteOnce"
      ]
    }
  }
}

emptyDir 卷

emptyDir 卷是排在永久性卷之后的最后选项。

仅当将群集与文件系统配额一起使用时才使用 emptyDir 卷。 有关详细信息,请参阅文件系统项目配额选项卡。如果未启用该功能,群集将执行定期扫描,这不会强制实施任何限制,并且允许主机节点填充磁盘空间并将整个主机节点标记为运行不正常。

例如,要使用容量为 1 GB 的 emptyDir 卷,请在“代理”资源中指定以下参数:

{
  "diskBackedMessageBuffer": {
    "maxSize": "1G"
  }
}

有关存储提供程序的注意事项

请考虑所选存储提供程序的行为,例如在使用 rancher.io/local-path 等提供程序时。 如果提供程序不支持限制,则填充卷会占用节点的磁盘空间。 此行为可能导致 Kubernetes 将节点和所有关联的 Pod 标记为运行不正常。 了解存储提供程序在此类情况下的行为至关重要。

已禁用

如果你不想使用磁盘支持的消息缓冲区,请不要在“代理”资源中包含 diskBackedMessageBufferSettings 属性。 此行为也是默认的行为。

持久性

请务必了解磁盘支持的消息缓冲区功能并不等同于永久性。 在此处上下文中,“永久性”是指在 Pod 重启后仍然存在的数据。 此功能为要保存到磁盘的数据提供了临时存储空间,这可在 Pod 重启期间防止内存溢出和数据丢失。