天天看点

Mqtt协议——cleansession、retain、will、Shared Subscription

前言

之前看了一些关于Mqtt协议的文章,看完了没有去做笔记,过了这么久忘了很多。最近刚好在做相关的东西,需要用到,就顺便记下来了。

正文

cleansession

清除会话

在客户端连接服务端时设置。

值为:true/false

作用:服务器必须在客户端断开之后继续存储/保持客户端的订阅状态,包括以下状态

  • 存储订阅的消息Qos1和Qos2消息,当客户端重新订阅时发送
  • 服务端正在发送消息给客户端期间连接丢失导致发送失败的消息

retain

持久消息。

想一下以下场景,你有个温湿度传感器,每隔几个钟向主题发送一次消息,此时你有个新的客户端订阅了这个主题,那它难道要等上几个钟才能获得消息吗?可不可以一订阅就获取上一次发送的消息呢? 答案是可以的

值为: true/false

作用:表示发送的消息需要一直持久保存(不受服务器重启影响),不但要发送给当前的订阅者,并且以后新来的订阅了此Topic name的订阅者会马上得到推送。

注意:新来的订阅了此topic name的订阅者指的是新的

clientID

用户,也就是说假如你是叫

12345

的用户在

同一次的连接

中多次重复订阅的话是和订阅一次一样的;(除非你①断线了重新连接了,②取消订阅后又重新订阅,这样都可以再次获得retain消息。)

如果你想要取消retian消息的话向这个主题发个空的消息就好了~

will

遗愿消息

想一下以下场景,你的设备向服务端发送了在线的消息后突然爆炸了,它还没来得及和服务端说它爆炸了就死了,这样会勿让我们以为它还在线,但其实它已经挂了。 有没有方法让客户端非正常断线后通知服务端呢? 有的,就是使用遗愿消息

在建立与服务端的连接时约定好遗愿消息,服务端会存储这个消息,当客户端非正常断线时则会向约定好的主题发送遗愿消息,同样,它也可以设置为

retian

share subscription

共享订阅(需要支持mqtt5.0的broker)

假设 4 个订阅者订阅了同一个主题,此时有发布者发送任务到该主题,以往的话是4个订阅者都会收到这条任务,然后去处理 ;但现在假如只想每条消息有一个订阅者处理即可,那么使用共享订阅就可以了

共享订阅针对场景应是数据的生产者远超出数据消费者数量,而且同一条数据(消息)只需要被任意其中一个消费者处理一次。主要是实现消费者数量处理消息的均衡负载。

Mqtt协议——cleansession、retain、will、Shared Subscription

创建共享订阅的两种方式:

主题前缀 实例
$queue/:topic sub $queue/up/data
$share/:group/:topic sub $share/group/up/data

共享订阅由三部分组成:

  • 静态共享标识符 ($queue 与 $share)
  • 组标识符(可选)
  • 实际接收消息的主题

$ queue和$ share的差异:

$queue 之后的主题中所有消息将轮流发送到客户端,

$share 之后,您可以添加不同的组,例如:

  • $share/group_1/topic
  • $share/group_2/topic
  • $share/group_3/topic

当broker 向 topic 发送消息时,每个组都会收到该消息,并将该消息随机发送给本组中的一个设备

继续阅读