关注分享主机优惠活动
国内外VPS云服务器

【如何构建商业级聊天系统】MQTT 第4部分)MQTT的特点:持久会话、保留消息、遗嘱

摘要:如何构建商业级聊天系统。 四个功能: 显示持久会话保留消息。 在本文中,我们将重点介绍一些值得注意的功能。 小心不要迷路。 我在处理神秘地址时遇到了麻烦。 持续会话。 为什么需要持久会话来接收消息?当客户端连接时,它会创建对感兴趣主题的订阅。 代理为每个主题仅存储一条保留消息。

[如何构建商业级聊天系统]MQTT 第 4 部分)MQTT 功能:持久会话、持久消息、Will

本文介绍了我将要介绍的一些值得注意的 MQTT 功能。
关注别迷路! ! 我几乎被一个神秘的地址困住了

1. 持久会话

为什么我需要持久会话?

从 MQTT 代理接收消息这样做,客户端将撰写消息。订阅感兴趣的主题。 如果客户端和代理之间的连接在非持久会话中断开,这些主题将会丢失。 也就是说,客户端将重新连接。 需要重新订阅,这对于资源有限的客户来说成本高昂。 同时,大多数业务场景需要存储记录客户端状态的持久会话(例如,在数据库中)。 接下来,我们建议在代理代理中存储会话状态和其他信息。 当客户端与服务代理建立连接时,它会根据唯一标识符提供会话信息(例如登录凭据或 clientId)。

持久会话中存储什么?

会话信息、客户端凭据 客户端的所有订阅信息 客户端未确认的 QoS 级别 1 或 2 的消息 如果客户端离线 所有消息当 QoS 2 消息尚未完全确认时,我错过了 QoS 级别 1 或 2

那么我如何开始或结束持久会话呢?

客户端可以将 cleanSession 标记为?告诉经纪人它想要什么样的会话。 您可以选择在与代理建立连接时请求持久会话。

cleanSession = true 非持久会话 如果客户端请求非持久会话,则当客户端与代理断开连接时,从前一个持久会话排队的所有消息都将被删除。将会丢失。

cleanSession = false 持久会话 当客户端请求持久会话时,代理服务器会保存所有会话信息。

最佳实践

这里我们将会话分为两部分:持久会话

strong>和明确n 会话 清理会话

何时使用持久会话

客户端会清理某个主题中的所有消息,即使我需要这样做也是如此。检索它并希望通过代理对消息进行排队,以便在重新连接时立即传送。 客户端资源有限,希望通过代理存储订阅消息并立即恢复中断的通信。 客户端重新连接后必须恢复所有 QOS 1 或 2 消息。

什么时候应该使用清理会话

客户端只需要发布消息;他们不需要订阅主题。 客户端不希望代理保存消息或重试发送 QOS 1 或 2。 客户不必离线检索丢失的消息。

2. 消息保留

为什么要保留消息

对于消息发布者和主题订阅者来说,所有事情都是由 Broker 代理处理的,所以双方都不需要保留消息。了解彼此的状态。 因此,该消息将被发布。 只有创造者才能这样做。 验证消息是否正确发送到 Broker Agent。 经纪人代理和主题订阅者之间也是如此。 消息发布者不知道什么时候向相应的主题发布消息。 在此期间,订阅该主题的新客户端对主题的状态一无所知。 这就是消息保留发挥作用的地方。

什么是保留消息?

保留消息是指保留标志设置为 true 的消息。常规 MQTT 消息,代理会保存主题的最后一条持久消息以及 Qos 级别。

每个订阅主题的客户端在订阅后都会立即收到持久化的消息。 代理为每个主题仅存储一条保留消息。

订阅客户端使用保留标志来确保消息“否”允许您保留该消息并决定如何处理它。

保留消息的作用

保留消息允许新订阅的客户端立即获取有关主题的状态更新因此,您可以消除等待时间。 发布客户端发出下一条消息的时间间隔。

最佳实践

哦,那么什么时候应该使用保留消息呢?您希望新订阅的客户端立即检索主题消息

这对于单个组件主题的状态更新非常有用,例如使用 /my/Temperature 获取温度状态。 如果使用保留消息,新订阅者订阅后将立即获得最新的温度状态。 如果不使用,当发布者发布下一条消息时,新订阅者将黑暗

3.遗嘱

为什么我们需要遗嘱?

MQTT 是为不可靠的网络场景而构建的。 由于连接丢失或电量消耗,可能会发生异常断开连接。 了解客户端是正常断开连接(MQTT DISCONNECT 消息)还是异常断开可以帮助您正确响应。 这就是遗嘱消息发挥作用的地方。

LWT Last Will and Testament

使用 LWT Last Will and Testament 和 MQTT 来通知其他客户端异常断开连接。 每个客户端在连接到代理时都可以指定 LWT。

LWT 是常规 MQTT 消息,包括主题、保留消息标志、QoS 和负载。 代理会存储消息,直到客户端异常断开连接。 断开连接后,代理会向订阅该主题的所有客户端发送一条 LWT 消息。 如果客户端成功断开连接,则 LWT 消息将被代理直接丢弃。

如何指定 LWT?

客户端可以在 CONNECT 上指定 LWT 消息

何时代理应该发送 LWT 消息吗?

根据 MQTT 规范,代理必须在以下情况下传递客户端 LWT 消息: 有。

如果代理检测到 I/O 错误或网络故障并且客户端无法交付,如果您定义了较长的 keepalive 时间,则客户端内的通信在关闭网络连接之前不会发送 DISCONNECT 数据包。 代理因协议错误而关闭连接

最佳实践

最终意愿 LWT 是通知订阅和发布客户端的有效手段。 异常断开。 这通常在生产中用于保存消息并保存有关特定主题的客户端状态。

示例:client1 首先向代理发送 CONNECT 数据包

lastWillMessage 将“offline”设置为有效负载

lastWillRetain 设置为 true

lastWillTopic 设置为 client1/status

连接后,client1 向主题发送一条 PUBLISH 消息,负载为“online”,并且 keep 标志设置为 true Send。

此时,只要client1连接上,所有新订阅该主题的客户端都会收到“在线”消息。

如果 client1 异常断开连接,broker 会向所有订阅客户端发送一条“离线”LWT 消息,该 LWT 消息将成为一条新的持久化消息发送给新的订阅者。

这种特殊的保留消息模式可用于通知其他客户端有关特定主题的 client1 连接状态。

未经允许不得转载:主机频道 » 【如何构建商业级聊天系统】MQTT 第4部分)MQTT的特点:持久会话、保留消息、遗嘱

评论 抢沙发

评论前必须登录!