跳到主要内容

管理MQTT会话

在 Solace PubSub+ 事件代理上,MQTT 会话对象保存 MQTT 客户端的状态(即,它用于包含客户端的 QoS 0 和 QoS 1 订阅集以及任何未交付的 QoS 1 消息)。MQTT 会话通过其客户端 ID 和相关的消息 VPN 进行标识。

您可以为现有的 MQTT 会话执行以下配置任务:

  • 创建 MQTT 会话
  • 设置 MQTT 会话所有者
  • 启用 MQTT 会话
  • 管理队列
  • 管理 MQTT 会话订阅
  • 使用特殊主题请求会话信息

创建MQTT会话

当 MQTT 客户端连接到事件代理时,可以自动创建 MQTT 会话。也可以使用 Solace CLI、SolAdmin 或 Solace 元素管理协议(SEMP)手动创建 MQTT 会话。

要在给定的消息 VPN 中手动创建 MQTT 会话,请输入以下命令:

solace(configure/message-vpn/mqtt)# create mqtt-session <client-id> [primary | backup | auto]

要配置给定消息 VPN 中的现有 MQTT 会话,请输入以下命令:

solace(configure/message-vpn/mqtt)# mqtt-session <client-id> [primary | backup | auto]

其中:

  • <client-id> 是与连接客户端使用的客户端 ID 匹配的客户端 ID。客户端 ID 最长可为 128 个字符。
  • primary 指定 MQTT 会话属于主虚拟路由器。
  • backup 指定 MQTT 会话属于备用虚拟路由器。
  • auto 指定 MQTT 会话属于主虚拟路由器或备用虚拟路由器,具体取决于冗余 active-standby-role 的当前设置。这是默认值。我们建议使用 auto 设置,除非事件代理配置为主动/主动 HA 冗余模型。

此命令的 no 版本 no mqtt-session 将删除给定的 MQTT 会话及其所有状态,包括未交付的消息。要删除 MQTT 会话,必须先将其关闭。

在 SolOS 版本 9.13.0 之前,auto 值不可用,创建时 MQTT 会话的默认虚拟路由器为 primary。如果您将 DR 站点升级到 9.13.0 或更高版本,则在 DR 站点上创建的任何 MQTT 会话作为 auto 将在传播到具有旧版本的 DR 站点时失败,导致 MQTT 会话的 MsgVpn 的 Config-Sync 失去同步,因为旧版本无法理解 auto 值。因此,在将任何 MQTT 会话配置为 auto 之前,请将所有复制的代理升级到至少 9.13.0 版本。

设置MQTT会话所有者

当 MQTT 客户端连接并自动创建 MQTT 会话时,连接客户端的客户端用户名就是 MQTT 会话的所有者。

当使用 CLI 或 SEMP 手动配置 MQTT 会话时,MQTT 会话没有分配的所有者。

要设置手动创建的 MQTT 会话的所有者,请输入以下命令:

solace(configure/message-vpn/mqtt/mqtt-session)# owner <owner>

其中:

  • <owner> 是在给定消息 VPN 中存在的客户端用户名。

此命令的 no 版本 no owner 将移除 MQTT 会话的任何配置所有者。

在更改所有者之前,必须先关闭 MQTT 会话。

启用MQTT会话

要启用给定的 MQTT 会话,请输入以下命令:

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

要禁用给定的 MQTT 会话,请输入以下命令:

solace(configure/message-vpn/mqtt/mqtt-session)# shutdown

当 MQTT 会话被禁用时,尝试连接到该会话的客户端将被拒绝,任何现有连接将被关闭。禁用的 MQTT 会话的 QoS 1 订阅将继续接收消息。

管理队列

为客户端创建的每个 MQTT 会话可以有一个关联的队列,用于存储客户端的 QoS 1 订阅和任何由这些订阅吸引的未交付消息。

当会话首次获得 QoS 1 订阅时,会自动为 MQTT 会话创建一个队列。创建后,队列的生命周期与 MQTT 会话绑定。只有当会话被销毁时,队列才会被销毁。

创建时,如果以下两个条件都为真,则队列的初始配置参数将从命名的 copy-from-on-create 队列中复制:

  • 客户端配置文件中存在这样的命名的 copy-from-on-create 队列
  • MQTT 会话是由连接的 MQTT 客户端自动创建的(而不是通过 CLI/SEMP 手动创建的)

无论初始配置参数来自何处,一旦创建,该队列的配置参数只能通过 MQTT 会话进行更改,除了以下几项:

  • owner——队列所有者始终反映会话所有者
  • access-type——始终为 exclusive
  • permissions——始终为 all read-only
  • shutdown——始终为 no shutdown

管理MQTT会话订阅

要为给定的 MQTT 会话创建主题订阅,请输入以下命令:

solace(configure/message-vpn/mqtt/mqtt-session)# create subscription <topic>

要配置给定 MQTT 会话的现有主题订阅,请输入以下命令:

solace(configure/message-vpn/mqtt/mqtt-session)# subscription <topic>

其中:

  • <topic> 是使用 MQTT 主题语法的主题名称。

尽管 MQTT 主题语法与用于 Solace 消息格式(SMF)消息的语法相似,但建议您参考主题支持与语法,以获取有关 MQTT 主题语法的信息以及在处理 MQTT 和 Solace PubSub+ 时应考虑的主题名称。

对于给定 MQTT 会话中的 MQTT 主题订阅,您可以执行以下操作:

  • 设置主题订阅的 QoS 等级
  • 添加/移除多个主题订阅

设置主题订阅的 QoS 等级

要设置给定 MQTT 会话中已配置主题订阅的 QoS 等级,请输入以下命令:

solace(...ge-vpn/mqtt/mqtt-session/subscription)# qos <qos-value>

其中:

  • <qos-value> 是要分配给主题订阅的 QoS 等级。有效值为 0(“最多一次交付”)或 1(“至少一次交付”)。

此命令的 no 版本 no qos 将订阅的 QoS 等级重置为默认值 0。

虽然不能配置 QoS 等级为 2。如果配置了 QoS 等级为 1,则匹配主题的 QoS 等级为 2 的消息将被接受,但将被视为 QoS 1 消息。

添加/移除多个主题订阅

您可以一次性订阅或取消订阅多个主题,而不是为 MQTT 会话添加或移除单个主题订阅。

要为给定 MQTT 会话添加或移除多个主题订阅,请输入以下命令:

solace(configure/message-vpn/mqtt/mqtt-session)# subscription-list qos <qos-value> \[<topic-list>\]

其中:

  • <qos-value> 是要添加或移除的主题订阅的 QoS 等级。有效范围为 0(“最多一次交付”)或 1(“至少一次交付”)。在移除主题订阅时,输入的 QoS 等级必须与要移除的主题订阅的 QoS 等级匹配。
  • <topic-list> 是主题列表,使用空格分隔,每个主题前面加上“+”(表示将添加主题订阅)或“-”(表示将移除主题订阅)。

使用特殊主题请求会话信息

MQTT 客户端可以向特殊保留主题添加主题订阅,这些主题将向客户端提供有关其自身和连接的事件代理的信息。这些信息包括分配给会话的客户端名称和为客户端保留的回复主题。这些特殊主题订阅将始终为 QoS 0,并且必须是精确匹配(即,它们不能包含通配符)。

当 MQTT 客户端订阅这些特殊主题之一时,事件代理会通过将相关信息发送给 MQTT 客户端来响应。返回的字符串不以 NULL 结束。

主题事件代理响应...
$SYS/client/client-name发布到此主题的消息正文提供了 MQTT 会话的客户端名称。
$SYS/client/reply-toMQTT 客户端的回复目的地。
发布到此主题的消息正文提供了为客户端保留的回复主题/目的地。

特殊主题用于请求 MQTT 会话信息。