前言
之前看了一些关于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个订阅者都会收到这条任务,然后去处理 ;但现在假如只想每条消息有一个订阅者处理即可,那么使用共享订阅就可以了
共享订阅针对场景应是数据的生产者远超出数据消费者数量,而且同一条数据(消息)只需要被任意其中一个消费者处理一次。主要是实现消费者数量处理消息的均衡负载。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9MWbiZHbuJGao1WZwZVbZFTOHpFdShlWvB3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxkjM2EzNzATM1EzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
创建共享订阅的两种方式:
主题前缀 | 实例 |
---|---|
$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 发送消息时,每个组都会收到该消息,并将该消息随机发送给本组中的一个设备