跳到主要内容

管理MQTT保留消息

使用 MQTT 保留消息允许发布 MQTT 客户端指示消息必须存储,以便在订阅客户端添加与保留消息主题匹配的订阅时,稍后将消息传递给订阅客户端。对于给定主题,事件代理保留该主题上发布的最后一条带有保留位的消息。在 Solace PubSub+ 事件代理上,保留消息保存在称为 MQTT 保留缓存的特殊 PubSub+ 缓存集群中。

MQTT 保留消息的支持是一个受控可用性(CA)功能。请与 Solace 联系,以了解此功能是否适用于您的用例。

先决条件

在事件代理能够处理 MQTT 保留消息之前,需要满足以下条件:

  • 必须为事件代理分配适当的内存以支持保留消息。有关更多信息,请参阅 MQTT 保留消息内存使用考虑。
  • 如果事件代理部署在冗余配置中,则必须为部署中的所有事件代理配置预共享身份验证密钥。有关更多信息,请参阅软件事件代理的预共享身份验证密钥或设备的预共享身份验证密钥。
  • 配置为高可用性(HA)冗余对的设备必须将其冗余角色配置为 primarybackup。有关更多信息,请参阅分配活动/备用角色。
  • 必须在事件代理上启用消息骨干。有关更多信息,请参阅启用所有消息服务。
  • 必须在事件代理上启用 SMF 服务。有关更多信息,请参阅启用系统级别的 SMF 服务。
  • 必须在事件代理上创建并启用 MQTT 保留缓存。有关更多信息,请参阅 MQTT 保留缓存配置。

限制

Solace PubSub+ 事件代理支持 MQTT 保留消息,但存在以下限制:

  • 在设备上使用保留消息需要 chassis 变体 CHS-3560AC-06-A 或更高版本。
  • 保留消息仅支持 DMR 和网桥。MNR 不支持。
  • 事件代理的保留消息传输机制相当于 QoS 0,尽管它具有保留 QoS 1 消息的能力。这意味着:
    • 即使事件代理未接受发布的消息,也可以保留 QoS 1 消息。
    • 保留缓存发送给客户端的 QoS 1 消息可能会丢失。以下是一些可能导致 QoS 1 保留消息丢失的因素:
      • 由于大量订阅和/或添加覆盖大量保留消息的通配符订阅,导致发送到客户端的保留消息突发大小。
      • 当保留消息突发队列向客户端时,消息队列和/或客户端的 QoS 1 队列上剩余的可用空间。
      • 客户端接收消息的速度。如果客户端能够比保留消息队列到客户端的速度更快地消费消息,则在保留消息突发时对消息队列和/或队列容量限制的压力很小。

MQTT保留消息内存使用考虑

启用 PubSub+ 事件代理以处理保留消息会消耗超出通常所需的额外系统内存。额外内存的量取决于主题的数量和长度,以及事件代理需要支持的保留消息的有效载荷。

对于任何合理的保留消息用例,PubSub+ 软件事件代理需要额外至少 2 GB 的内存来处理保留消息。如果保留消息较大,或者用例具有大量保留消息,则可能需要更多内存。Solace 建议您测试和监控您的部署的内存使用情况,并根据需要调整分配。

例如,假设您正在创建一个通常需要 4 GB 内存的 PubSub+ 软件事件代理(基于最大客户端连接数)。如果此事件代理需要处理保留消息,则必须在主机上预留额外至少 2 GB 的内存来处理这些消息。

在预留了此额外内存后,您可以通过为事件代理上所有保留缓存配置最大共享内存池来分配它。有关更多信息,请参阅 MQTT 保留缓存共享内存配置。

冗余事件代理部署中的MQTT保留消息

在冗余事件代理部署中使用保留消息时,请考虑以下事项:

  • 在冗余部署中使用保留消息之前,您必须在每个事件代理上设置预共享身份验证密钥。有关更多信息,请参阅软件事件代理的预共享身份验证密钥或设备的预共享身份验证密钥。
  • 在主动/主动部署中不支持保留消息。
  • 在任何主事件代理离线的情况下,重新建立与网络的连接(现在在备用上)的行为,会导致重新传递所有适合每个客户端主题订阅的保留消息。故障转移过程还可能导致保留消息的多次传递。

MQTT保留缓存全局内存配置

您可以为代理上所有 MQTT 保留缓存配置全局最大允许内存。如果达到最大内存,则所有到达的保留消息将被丢弃。默认情况下,软件事件代理没有分配内存,这意味着所有到达的保留消息将被丢弃。设备分配了 1024 MB。

要配置保留缓存的全局最大允许内存,请输入以下命令:

solace(configure)# mqtt
solace(configure/mqtt)# retain
solace(configure/mqtt/retain)# max-memory <megabytes>

其中:

  • <megabytes> 是为代理上所有保留缓存分配的共享池的兆字节数。此命令的 no 版本将值返回到默认值。

MQTT保留缓存配置

MQTT 保留缓存按每个消息 VPN 进行配置。每个保留缓存处理消息 VPN 的所有保留消息。

当您创建保留缓存时,还会创建许多辅助的 PubSub+ 缓存对象。有关更多信息,请参阅使用 MQTT。

在软件事件代理上,在启用保留缓存之前,您必须为事件代理上所有保留缓存配置全局最大允许内存。有关更多信息,请参阅 MQTT 保留缓存共享内存配置。

在移除保留缓存之前,您必须禁用它。当您移除保留缓存时,所有保留消息将丢失,并且所有在途和后续请求将被忽略。

要创建 MQTT 保留缓存,请输入以下命令:

solace(configure)# message-vpn <vpn-name>
solace(configure/message-vpn)# mqtt
solace(configure/message-vpn/mqtt)# retain
solace(configure/message-vpn/mqtt/retain)# create cache <retain-cache-name>

要修改现有保留缓存,请输入以下命令:

solace(configure/message-vpn/mqtt/retain)# cache <cache-name>

要启用保留缓存,请输入以下命令:

solace(configure/message-vpn/mqtt/retain/cache)# no shutdown

其中:

  • <cache-name> 是您要配置的保留缓存的名称。

您可以为现有保留缓存执行的配置任务包括:

  • 配置保留消息的生命周期

配置保留消息的生命周期

您可以配置希望消息在 MQTT 保留缓存中持续存在的时间长度。如果消息在其生命周期内保持缓存状态,则保留缓存将移除该消息。默认情况下,没有配置限制。

要为保留缓存配置保留消息的生命周期,请输入以下命令:

solace(configure/message-vpn/mqtt/retain/cache)# message-lifetime <seconds>

其中:

  • <seconds> 是消息的生命周期(以秒为单位)。生命周期为 0 将导致消息无限期保留。此命令的 no 版本将值返回到默认值。

监控MQTT保留缓存

本节提供了一些示例,展示了如何在您的 PubSub+ 事件代理上监控 MQTT 保留缓存。

有以下两种方法可以做到这一点:

  • 监控保留缓存的推荐方法是使用 PubSub+ Broker Manager。登录后,选择一个消息 VPN 并导航到 Caches > MQTT 保留缓存
  • 或者,您可以通过 Solace CLI 监控保留缓存,有关更多信息,请参阅以下部分。

由于 PubSub+ 缓存是管理保留消息的底层机制,除了以下部分外,还请参阅监控 PubSub+ 缓存以获取有关监控 PubSub+ 缓存组件的一般信息。

显示通用 MQTT 保留缓存信息

要显示有关 MQTT 保留缓存的通用信息,请输入以下命令:

show message-vpn <message-vpn> mqtt retain cache <cache-name> [detail]

其中:

  • <message-vpn> 是保留缓存所在的消息 VPN 的名称。
  • <cache-name> 是您要监控的保留缓存的名称。
  • detail 显示有关保留缓存的详细信息,包括创建以支持保留缓存的 PubSub+ 缓存对象的名称。有关这些对象的更多信息,请参阅使用 MQTT。

显示保留缓存统计信息

要显示有关 MQTT 保留缓存的统计信息,包括内存和 CPU 使用情况,请输入以下命令:

show cache-instance <name> message-vpn <vpn-name> remote status

其中:

  • <name> 是创建以支持保留缓存的 PubSub+ 缓存实例的名称。有关更多信息,请参阅使用 MQTT。
  • <vpn-name> 是保留缓存所在的消息 VPN 的名称。

显示保留缓存主题

要显示 MQTT 保留缓存订阅的主题列表,请输入以下命令:

show cache-instance <name> message-vpn <vpn-name> remote topics

其中:

  • <name> 是创建以支持保留缓存的 PubSub+ 缓存实例的名称。有关更多信息,请参阅使用 MQTT。
  • <vpn-name> 是保留缓存所在的消息 VPN 的名称。

清除保留缓存统计信息

要清除 MQTT 保留缓存统计信息,请输入以下命令:

clear cache-instance <name> message-vpn <vpn-name> stats

其中:

  • <name> 是创建以支持保留缓存的 PubSub+ 缓存实例的名称。有关更多信息,请参阅使用 MQTT。
  • <vpn-name> 是保留缓存所在的消息 VPN 的名称。

保留缓存事件

有关 MQTT 保留缓存事件的完整列表,请参阅 Syslog 事件参考中的 PubSub+ 缓存 syslog 消息 部分。

验证保留缓存的冗余性

要验证保留缓存是否冗余(例如,确保在升级过程中没有消息丢失),您必须验证相应的主缓存实例和备用缓存实例是否已同步。必须为已配置保留缓存的所有消息 VPN(并预期运行)验证此同步。

要验证主缓存实例和备用缓存实例是否已同步,请输入以下命令并确认每个缓存实例都处于运行状态:

show message-vpn * mqtt retain cache * detail