MQTT:遗嘱的目的或用途是什么?

41

我显然对整个MQTT协议的工作方式有所遗漏,因为我无法理解遗嘱消息(Last Will Testament)的使用模式:它们的目的是什么?
我经常看到的一个例子是通知设备已离线。这对我来说并没有太多意义,因为很明显,如果设备不发布任何数据,它可能处于离线状态或存在一些网络问题。

那么,LWT的一些实际用途是什么?它是为什么而发明的呢?

3个回答

93
LWT消息并不关心客户端是否已下线(这个任务由keepAlive消息处理)。LWT消息关注的是客户端下线后发生的事情。
类比现实中的遗嘱:当一个人去世时,她可以制定遗嘱,声明她去世后应该采取什么行动。执行者会遵从这些愿望并代表她执行。在MQTT世界中,一个客户端可以制定遗嘱,在其中声明经纪人在其离线后应该代表它发送什么消息。
例如:我有一个传感器,它发送重要但非常不频繁的数据。它已经用形如[topic: '/node/gone-offline',message: ':id']的形式制定了一份遗嘱,其中:id是传感器的唯一ID。我还为主题“node/gone-offline”有一个紧急订阅者,每次在该通道上发布一条消息时,它都会向我的手机发送短信。
在正常操作期间,传感器将通过发送周期性的keepAlive消息与实际的传感器读数来保持与MQTT经纪人的连接。如果传感器离线,由于缺乏keepAlives,与经纪人的连接将超时。
这就是LWT的作用:如果未指定LWT,则经纪人不关心并仅关闭连接。然而,在我们的情况下,经纪人将执行传感器的遗嘱并发布LWT消息'/node/gone-offline::id'。然后,该消息将由我的紧急订阅者消费,并通过短信通知我传感器的ID,以便我可以查看发生了什么事。
简而言之:
与其只是在客户端离线后关闭连接,不如利用LWT消息来定义经纪人代表客户端发布的消息,因为客户端已经离线不能再发布任何消息。

1
此外,keepAlive消息仅由代理发送和接收,并且与Last Will的主要区别在于:任何人都可以订阅此主题并注意到客户端下线。 - Joaquín L. Robles

11

仅因设备未发布信息并不意味着它不在线或存在网络问题。

举例来说,有一个传感器监测的数值很少发生变化,良好的设计应当只在数值发生变化时进行发布以节省带宽使用,定期发布相同数值是浪费的。如果将该数值发布为保留值,则任何新订阅者都可以获得当前值,而不必等待传感器数值再次变化并重新发布。

在这种情况下,LWT用于在传感器出现故障(或存在网络问题)时发布,这样我们就可以知道问题所在,并在客户端保持活动状态超时后立即采取措施。


9
MQTT Essentials博客系列中提供了一篇关于遗嘱消息的深入文章:http://www.hivemq.com/mqtt-essentials-part-9-last-will-and-testament/
总结博客内容:
MQTT中的“遗嘱”功能用于通知其他客户端有不正常断开连接的客户端。
MQTT通常用于网络不可靠的场景。因此,假定某些客户端会不时地断开连接,因为它们失去了连接、电池电量耗尽或任何其他可以想象的情况。如果已连接的客户端已正常断开连接(这意味着使用了MQTT“DISCONNECT”消息),则应该知道,以便采取适当的措施。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接