【译文】什么是未来消息-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"字样的内容
相关推荐
雨白6 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk6 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING7 小时前
RN容器启动优化实践
android·react native
恋猫de小郭9 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker14 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴14 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos