【译文】什么是未来消息-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"字样的内容
相关推荐
二流小码农1 小时前
鸿蒙开发:DevEcoStudio中的代码提取
android·ios·harmonyos
江湖有缘2 小时前
使用obsutil工具在OBS上完成基本的数据存取【玩转华为云】
android·java·华为云
移动开发者1号3 小时前
Android 多 BaseUrl 动态切换策略(结合 ServiceManager 实现)
android·kotlin
移动开发者1号3 小时前
Kotlin实现文件上传进度监听:RequestBody封装详解
android·kotlin
AJi6 小时前
Android音视频框架探索(三):系统播放器MediaPlayer的创建流程
android·ffmpeg·音视频开发
柿蒂7 小时前
WorkManager 任务链详解:优雅处理云相册上传队列
android
alexhilton7 小时前
使用用例(Use Case)以让Android代码更简洁
android·kotlin·android jetpack
峥嵘life7 小时前
Android xml的Preference设置visibility=“gone“ 无效分析解决
android·xml
用户2018792831678 小时前
通俗故事:驱动二进制文件在AOSP中的角色
android
穷人小水滴8 小时前
在 Termux 中签名 apk 文件
android·linux·apk