【译文】什么是未来消息-Last Will and Testament (LWT)? – MQTT 基础: 第九部分

在文章翻译前,简单补充说明一下,MQTT官网中,没有使用到Last Will and Testament 这个描述,根据3.1版本协议,3.1.1版本协议,5.0版本协议,能与之关联的规范用语词为Will Message, 在5.0版本协议中给出了具体定义:An Application Message which is published by the Server after the Network Connection is closed in cases where the Network Connection is not closed normally (即:网络连接异常断开时,服务器发送的一种应用消息)。

在本篇文章中我会把LWT翻译为:未来消息


原文:www.hivemq.com/blog/mqtt-e...

本篇文章在翻译过程中,对相关内容进行了一些删减,比如文字超链接

作者: HiveMQ Team

发布时间: March 9, 2015

更新于: 2023年6月27日

未来消息在MQTT中是一个强大的功能,它允许客户端指定一条消息,在自己发生意外断开连接时,由代理服务器自动发送这条消息。它提供了一种可靠的通信,并且确保了客户端可以优雅的处理异常断开情况。在异常断开情况下,当客户端需要通知其他客户端自己不在线或者传递一些重要信息时,未来消息就显得非常有价值。

让我们开始学习本节内容吧。

什么是"未来消息"?

在普遍存在网络不可靠的场景下,MQTT客户端遇到偶发性意外中断就是一件平常事(比如:连接断开了或者没电了)。理解断开连接类型对能否采用合适的措施至关重要(优雅的断开:断开连接时发布一条断开消息,非优雅的断开:断开连接时不发任何断开消息)

MQTT中的未来消息可以应对非优雅式的连接中断事件,并确保能合适的处理此类意外事件

"未来消息"可以让客户端在他们自己发生意外中断连接情况下,通知到其他客户端。 当一个客户端连接到代理服务器时,它可以定制一条自己的"未来消息"。未来消息也是要遵循MQTT消息结构的,它也会包含主题,保留消息标志,QoS,消息负载体 ,代理服务器在客户端发生意外断开前,会一直存储这条未来消息。一旦代理服务器侦测断开发生,代理服务器会广播这条未来消息至已订阅了此消息主题的客户端,如果客户端使用DISCONNECT方式断开,代理服务器会抛弃存储的"未来消息"。

断开包结构

利用未来消息,你可以采用多种策略去处理客户端断开,并把离线状态通知给其它客户端。

如何在MQTT 客户端配置"未来消息"呢?

为了给客户端定制"未来消息",你需要把"未来消息"包含在CONNECT消息中,CONNECT消息是被用来初始化客户端和代理服务器初始化用的。

MQTT代理服务器会在什么时候发送"未来消息"呢?

根据MQTT 3.1.1 规范, 代理服务器在如下情况发生时,会自动发送"未来消息":

  1. I/O 错误 或者 网络失败: 如果代理服务器监测到I/O或者网络连接错误时,它会分发"未来消息"
  2. 保活期间通信失败: 如果客户端在代理服务器允许的保活期间内发生了通信失败,"未来消息"会给发送
  3. 未发送DISCONNECT消息而关闭连接: 当客户端没有发送DISCONNECT包时就中断网络连接,代理服务器会确保"未来消息"被分发下去
  4. 由于协议错误,代理服务器关闭了连接: 如果代理服务器因为协议错误关闭了网络连接,代理服务器也会发送"未来消息"

了解"未来消息"发送的时间和原因对我们利用这个功能实现最佳实践奠定了基础。

在什么时候使用"未来消息"?

事实证明,"未来消息"在提醒客户端"意外断开连接"事件来讲是非常有价值的。当和保留消息结合使用时,对于存储客户端通信状态来讲,它会变成一个强大的工具。

例如, 通过设置 带Offline消息负载体的lastWillMessage时, 启用lastWillRetain标志, 然后指定lastWillTopicclient1/status , 接下来发布一个Online 保留消息到client1/status , client1 可以让新接入的订阅客户端拿它在线的状态。如果client1意外断开连接,代理服务器将发布带有Offline"消息负载体的"未来消息"作为新的保留消息,确保已订阅这个主题的客户端在client1离线时可以收到这个"未来消息",并保持它的当前状态一直是最新的。

"未来消息"不仅能提醒客户端意外断开连接,而且通过提供有价值的客户端状态信息,也可帮助维护系统的完整性。将"未来消息"与保留消息结合起来,可以创建一个健壮的解决方案,该解决方案存储并通信特定主题上的最新客户机状态,确保所有订阅者都能获得可靠的最新数据。这种方法支持客户端之间的无缝集成和同步,增强了MQTT网络的整体弹性和功能。

未来消息的重要性: 小结

总而言之,未来消息在确保高效通信和维护系统处理意外断开事件上,作用是至关重要的。通过将未来消息与保留消息结合起来,开发人员可以存储特定主题上的客户端通信状态,从而为订阅了特定主题的客户端提供有价值的信息 "未来消息"让MQTT网络更具适应性、无缝集成和可靠的数据更新,使其成为各种应用程序的强大工具。通过了解"未来消息"的好处和最佳实践,您可以利用这个特性来创建健壮和有效的 MQTT解决方案。


以下非原文翻译

为了更好理解"未来消息",可以使用"MQTTHarvey"工程中的"ExampleLWTDetail.java"文件来实践。

关于其它的准备工作可参见"MQTT 实践"

实验步骤:

  1. 启动工程
  2. 启动MQTTX客户端,订阅"harvey"主题
  3. 通过InteIIJ IDEA菜单中的红色停止按钮来终止工程运行
  4. 终止之后,在MQTTX客户端中可以收到"Offline"字样的内容
相关推荐
梁同学与Android2 分钟前
Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
android
Frank_HarmonyOS3 小时前
【无标题】Android消息机制
android
凯文的内存4 小时前
Android14 OTA升级速度过慢问题解决方案
android·ota·update engine·系统升级·virtual ab
VinRichard5 小时前
Android 常用三方库
android
Aileen_0v06 小时前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
江上清风山间明月9 小时前
Flutter DragTarget拖拽控件详解
android·flutter·ios·拖拽·dragtarget
2401_8827264810 小时前
低代码配置式组态软件-BY组态
前端·物联网·低代码·前端框架·编辑器·web
深圳启明云端科技10 小时前
WiFi、蓝牙共存,物联网无线通信技术,设备无线连接数据传输应用
网络·物联网·智能家居
寒暄喆意10 小时前
智慧农业物联网传感器:开启农业新时代
大数据·人工智能·科技·物联网
程序员JerrySUN11 小时前
Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制
linux·嵌入式硬件·物联网·缓存·系统架构