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个订阅者都会收到这条任务,然后去处理 ;但现在假如只想每条消息有一个订阅者处理即可,那么使用共享订阅就可以了

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


在这里插入图片描述
创建共享订阅的两种方式:

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

共享订阅由三部分组成:

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

$ queue和$ share的差异:

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

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

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

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

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值