第十四章 MQTT订阅

系列文章目录

系列文章目录
第一章 总体概述
第二章 在实体机上安装ubuntu
第三章 Windows远程连接ubuntu
第四章 使用Docker安装和运行EMQX
第五章 Docker卸载EMQX
第六章 EMQX客户端MQTTX Desktop的安装与使用
第七章 EMQX客户端MQTTX CLI的安装与使用
第八章 Wireshark工具的安装与使用
第九章 MQTT报文
第十章 MQTT消息质量等级QoS
第十一章 MQTT主题
第十二章 MQTT会话
第十三章 MQTT消息
第十四章 MQTT订阅


文章目录

  • 系列文章目录
  • 前言
  • 1 订阅选项
    • 1.1 订阅选项简介
    • 1.2 QoS
      • 1.2.1 QoS订阅选项简介
      • 1.2.2 QoS订阅选项演示
    • 1.3 No Local
      • 1.3.1 No Local订阅选项简介
      • 1.3.2 No Local订阅选项演示
        • 允许转发
        • 不允许转发
    • 1.4 Retain As Published
      • 1.4.1 Retain As Published订阅选项简介
      • 1.4.2 Retain As Published订阅选项演示
    • 1.5 Retain Handling
      • 1.5.1 Retain Handling订阅选项简介
      • 1.5.2 Retain Handling订阅选项演示
  • 2 共享订阅
    • 2.1 共享订阅简介
    • 2.2 共享订阅分类
      • 2.2.1 带群组的共享订阅
      • 2.2.2 不带群组的共享订阅
    • 2.3 共享订阅演示
    • 2.4 负载均衡算法
  • 3 排它订阅
    • 3.1 排它订阅简介
    • 3.2 排它订阅演示
  • 4 自动订阅
    • 4.1 配置自动订阅规则
    • 4.2 演示自动订阅使用
  • 总结


前言


1 订阅选项

1.1 订阅选项简介

订阅的组成:

1、主题过滤器:决定了服务端将向我们转发哪些主题下的消息

2、订阅选项:是允许我们进一步定制服务端的转发行为

MQTT 5.0提供了4个订阅选项:QoS、No Local、Retain As Published、Retain Handling

1.2 QoS

1.2.1 QoS订阅选项简介

QoS 是最常用的一个订阅选项,它表示服务端在向订阅端发送消息时可以使用的最大QoS等级。

情况1:服务端支持的最大 QoS < 客户端订阅时请求的最大QoS

服务端将无法满足客户端的要求,这时服务端就会通过订阅的响应报文(SUBACK)告知订阅端最终授予的最大 QoS 等级,订阅端可以自行评估是否接受并继续通信。
在这里插入图片描述

情况2:订阅时请求的最大QoS < 消息发布时的QoS

为了尽可能地投递消息,服务端不会忽略这些消息,而是会在转发时对这些消息的 QoS 进行降级处理。
在这里插入图片描述

1.2.2 QoS订阅选项演示

具体步骤如下所示:

1、创建sub客户端连接,并且订阅test/n主题, 并指定QOS为1
在这里插入图片描述

2、订阅成功以后,通过pub客户端连接向test/n主题发布消息,并且指定QOS的登记为2
在这里插入图片描述

3、结果:sub客户端收到的消息的QOS值为1
在这里插入图片描述


1.3 No Local

1.3.1 No Local订阅选项简介

No Local取值:

1、0(默认值):服务端可以将消息转发给发布这个消息的客户端

2、1:服务端不可以将消息转发给发布这个消息的客户端

这个订阅选项尝尝被用在桥接场景中,桥接本质上是两个 MQTT Server 建立了一个 MQTT 连接,然后相互订阅一些主题,Server 将客户端的消息转发给另一个 Server,而另一个 Server 则可以将消息继续转发给它的客户端。
在这里插入图片描述
在桥接的场景中,如果没有将No Local订阅选项的值设置为1,那么此时会形成转发风暴

举例:假设两个 MQTT Server 分别是 Server A 和 Server B,它们分别向对方订阅了#主题。现在,Server A 将一些来自客户端的消息转发给了 Server B,而当 Server B 查找匹配的订阅时,Server A 也会位于其中。如果 Server B 将消息转发给了 Server A,那么同样 Server A 在收到消息后又会把它们再次转发给 Server B,这样就陷入了无休止的转发风暴。

而如果 Server A 和 Server B 在订阅 # 主题的同时,将 No Local 选项设置为 1,就可以完美地避免这个问题。

1.3.2 No Local订阅选项演示

允许转发

具体步骤:

1、创建sub客户端连接,并订阅test/k主题,并且设置No Local订阅选项为0
在这里插入图片描述

2、使用sub客户端连接向test/k主题发布消息
在这里插入图片描述

结果:当前的客户端连接收到该主题中的消息。

不允许转发

具体步骤:

1、创建sub客户端连接,并订阅test/u主题,并且设置No Local订阅选项为1
在这里插入图片描述

2、使用sub客户端连接向test/u主题发布消息
在这里插入图片描述

结果:当前的客户端没有接收到该主题中的消息。

1.4 Retain As Published

1.4.1 Retain As Published订阅选项简介

Retain As Published取值:

1、0(默认值):服务端在向此订阅转发应用消息时需要清除消息中的 Retain 标识

2、1:服务端在向此订阅转发应用消息时需要保持消息中的 Retain 标识

应用场景:桥接场景

桥接场景下带来了一些问题。我们继续沿用前面的设定,当 Server A 将保留消息转发给 Server B 时,由于消息中的 Retain 标识已经被清除,Server B 将不会知道这原本是一条保留消息,自然不会再存储它。这就导致了保留消息无法跨桥接使用。

那么在 MQTT 5.0 中,我们可以让桥接的服务端在订阅时将 Retain As Published 选项设置为 1,来解决这个问题。
在这里插入图片描述

1.4.2 Retain As Published订阅选项演示

具体步骤如下:

1、创建sub客户端连接,分别订阅主题test/demo01test/demo02, 并且将Retain As Published设置为 0 和 1
在这里插入图片描述
在这里插入图片描述

2、通过sub客户端连接分别向sub/rap/demo01sub/rap/demo02主题发布保留消息

在这里插入图片描述

在这里插入图片描述

3、结果看出,只有demo02保留了retain标志。

1.5 Retain Handling

1.5.1 Retain Handling订阅选项简介

作用:Retain Handling 这个订阅选项被用来向服务端指示当订阅建立时,是否需要发送保留消息

Retain Handling常见取值:

1、0(默认值):表示只要订阅建立,就发送保留消息;

2、1:表示只有建立全新的订阅而不是重复订阅时,才发送保留消息;

3、2:表示订阅建立时不要发送保留消息;

1.5.2 Retain Handling订阅选项演示

1、演示之前,先对MQTTX进行设置。
在这里插入图片描述
2、查看EMQX中有哪些保留消息。
在这里插入图片描述

具体步骤如下所示:

情况1:Retain Handling值设置为0

1、开启客户端的自动重订阅功能

2、创建sub客户端连接(Clean Start值设置为1,并且将Session Expiry Interval设置为300)在这里插入图片描述

3、在sub客户端连接中,订阅test/demo01主题,并且将Retain Handling的值设置为0
在这里插入图片描述
在这里插入图片描述

结果:只要订阅成功了,那么此时立马会收到保留消息

4、关闭客户端连接,设置客户端的Clean Start值设置为0表示需要复用之间的会话
在这里插入图片描述

在这里插入图片描述

注意:只要是重新订阅成功了,那么此时就会收到保留消息

情况2:Retain Handling设置为1

删除sub客户端连接中的订阅,重新订阅test/demo01主题,并且将Retain Handling的值设置为1,新建立的订阅是可以获取到保留消息的。
在这里插入图片描述
在这里插入图片描述

关闭当前连接,重新建立连接【会自动复用之前的订阅】,此时无法获取到保留消息。

情况3: Retain Handling设置为2

删除sub客户端连接中的订阅,重新订阅test/demo01主题,并且将Retain Handling的值设置为2
在这里插入图片描述

结果:即使订阅成功了,那么此时也不会收到保留消息
在这里插入图片描述


2 共享订阅

2.1 共享订阅简介

在普通的订阅中,我们每发布一条消息,所有匹配的订阅端都会收到该消息的副本。当某个订阅端的消费速度无法跟上消息的生产速度时,我们没有办法将其中一部分消息分流到其他订阅端中来分担压力。这使订阅端容易成为整个消息系统的性能瓶颈。
在这里插入图片描述
MQTT 5.0 引入了共享订阅特性,它使得 MQTT 服务端可以在使用特定订阅的客户端之间均衡地分配消息负载。这表示,当我们有两个客户端共享一个订阅时,那么每个匹配该订阅的消息都只会有一个副本投递给其中一个客户端。
在这里插入图片描述
共享订阅不仅为消费端带来了极佳的水平扩展能力,使我们可以应对更高的吞吐量,还为其带来了高可用性,即使共享订阅组中的一个客户端断开连接或发生故障,其他客户端仍然可以继续处理消息,在必要时还可以接管原先流向该客户端的消息流。

2.2 共享订阅分类

启用共享订阅:为一组订阅者的原始主题添加指定前缀

共享订阅分类:

前缀格式示例前缀真实主题名
带群组格式$share/abc/t/1$share/abct/1
不带群组格式$queue/t/1$queue/t/1

2.2.1 带群组的共享订阅

您可以通过在原始主题前添加 $share/<group-name> 前缀为分组的订阅者启用共享订阅。组名可以是任意字符串。EMQX 同时将消息转发给不同的组,属于同一组的订阅者可以使用负载均衡接收消息。

例如,如果订阅者 s1s2s3 是组 g1 的成员,订阅者 s4s5 是组 g2 的成员,而所有订阅者都订阅了原始主题 t1。共享订阅的主题是 $share/g1/t1$share/g2/t1。当 EMQX 发布消息 msg1 到原始主题 t1 时:

  • EMQX 将 msg1 发送给 g1g2 两个组。
  • s1s2s3 中的一个订阅者将接收 msg1
  • s4s5 中的一个订阅者将接收 msg1
    在这里插入图片描述

2.2.2 不带群组的共享订阅

$queue/ 为前缀的共享订阅是不带群组的共享订阅。它是 $share 订阅的一种特例。您可以将其理解为所有订阅者都在一个订阅组中:

在这里插入图片描述

2.3 共享订阅演示

1、创建4个客户端连接分别是sub1sub2sub3sub4
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、其中s1和s2属于同一个共享订阅组g1, s3和s4属于同一个共享订阅组g2

订阅的主题如下所示:

sub1: $share/g1/t/1
在这里插入图片描述

sub2: $share/g1/t/1

sub3: $share/g2/t/1
在这里插入图片描述

sub4: $share/g2/t/1

3、创建pub客户端连接,并且向t/1主题发布两条消息观测结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

默认的负载均衡算法:轮询

3、删除sub1、sub2、sub3、sub4的订阅信息,重新添加$queue/t/1订阅
在这里插入图片描述

4、通过pub客户端向t/1主题发布消息观测结果
在这里插入图片描述

2.4 负载均衡算法

可以通过Dashboard进行负载均衡算法的配置【管理====>MATT配置】:
在这里插入图片描述
在这里插入图片描述

大致可以分为:

1、随机(Random),在共享订阅组内随机选择一个会话发送消息。

2、轮询(Round Robin),在共享订阅组内按顺序选择一个会话发送消息,循环往复。

3、哈希(Hash),基于某个字段的哈希结果来分配。

4、粘性(Sticky),在共享订阅组内随机选择一个会话发送消息,此后保持这一选择,直到该会话结束再重复这一过程。

5、本地优先(Local),随机选择,但优先选择与消息的发布者处于同一节点的会话,如果不存在这样的会话,则退化为普通的随机策略。


3 排它订阅

3.1 排它订阅简介

排它订阅允许对主题进行互斥订阅,一个主题同一时刻仅被允许存在一个订阅者,在当前订阅者未取消订阅前,其他订阅者都将无法订阅对应主题。

要进行排它订阅,您需要为主题名称添加$exclusive/前缀,如以下表格中的示例:

示例前缀真实主题名
$exclusive/t/1$exclusive/t/1

当某个客户端 A 订阅 $exclusive/t/1 后,其他客户端再订阅 $exclusive/t/1 时都会失败,直到 A 取消了对 $exclusive/t/1 的订阅为止。

注意: 排它订阅必须使用 $exclusive/ 前缀,在上面的示例中,其他客户端依然可以通过 t/1 成功进行订阅。

订阅失败的常见错误码:
在这里插入图片描述

3.2 排它订阅演示

默认情况下排它订阅是关闭的。

具体步骤:

1、创建sub1客户端连接,并且添加$exclusive/t/1订阅
在这里插入图片描述
2、在Dashboard开启排它订阅配置【管理====>MATT配置】
在这里插入图片描述
3、在sub1客户端连接中重新添加$exclusive/t/1订阅

4、创建sub2客户端连接,并且添加$exclusive/t/1订阅
在这里插入图片描述
5、创建sub2客户端连接,并且添加t/1订阅,此时订阅成功

4 自动订阅

自动订阅能够给 EMQX 设置多个规则,在设备成功连接后按照规则为其订阅指定主题,不需要额外发起订阅。

4.1 配置自动订阅规则

通过 Dashboard 配置自动订阅规则:【管理 ====> MQTT高级特性 =====> 自动订阅 ====> 添加】
在这里插入图片描述

4.2 演示自动订阅使用

具体步骤:

1、创建pub客户端连接,作为发布者

2、创建sub客户端连接,作为订阅者

3、在pub客户端连接中向a/1主题发布消息

在这里插入图片描述


总结

以上,就是MQTT订阅介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第4章 图像与视频】4.4 离屏 canvas

文章目录 前言为什么要使用 offscreenCanvas为什么要使用 OffscreenCanvas如何使用 OffscreenCanvas第一种使用方式第二种使用方式 计算时长超过多长时间适合用Web Worker 前言 在 Canvas 开发中&#xff0c;我们经常需要处理复杂的图形和动画&#xff0c;这些操作可能会影响页…

Go语言事件总线EventBus本地事件总线系统的完整实现框架

在Go语言中&#xff0c;EventBus是一种非常有用的工具&#xff0c;它通过事件驱动的编程方式&#xff0c;帮助开发者实现组件之间的解耦&#xff0c;提高代码的可维护性和扩展性。 背景 软件架构的发展需求&#xff1a;随着软件系统的规模和复杂度不断增大&#xff0c;传统的紧…

Go语言接口:灵活多态的核心机制

引言 Go语言的接口系统是其​​面向对象编程​​的核心&#xff0c;它摒弃了传统语言的类继承体系&#xff0c;采用独特的​​隐式实现​​和​​鸭子类型​​设计。这种设计使得Go接口既灵活又强大&#xff0c;成为构建松耦合系统的关键工具。本文将深入剖析Go接口的实现机制…

DeviceNET转EtherCAT网关:医院药房自动化的智能升级神经中枢

在现代医院药房自动化系统中&#xff0c;高效、精准、可靠的设备通信是保障患者用药安全与效率的核心。当面临既有支持DeviceNET协议的传感器、执行器&#xff08;如药盒状态传感器、机械臂限位开关&#xff09;需接入先进EtherCAT高速实时网络时&#xff0c;JH-DVN-ECT疆鸿智能…

android实现使用RecyclerView详细

显示页面代码&#xff1a;activity_category_inventory.xml代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:app"http://schemas.and…

【SpringBoot实战】优雅关闭服务

文章目录 一、什么是优雅关闭&#xff1f;二、优雅关闭的核心步骤三、SpringBoot优雅关闭实现四、关键注意事项1. 超时时间必须配置2. 信号支持局限性3. 特殊请求处理 五、底层实现原理六、总结 一、什么是优雅关闭&#xff1f; 优雅关闭&#xff08;Graceful Shutdown&#x…

C++哈希表:unordered系列容器详解

本节目标 1.unordered系列关联式容器 2.底层结构 3.模拟实现 4.哈希的应用 5.海量数据处理面试题 unordered系列关联式容器 在c98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可以达到logN&#xff0c;即最差的情况下需要比较红…

java操作服务器文件(把解析过的文件迁移到历史文件夹地下)

第一步导出依赖 <dependency><groupId>org.apache.sshd</groupId><artifactId>sshd-core</artifactId><version>2.13.0</version></dependency> 第二步写代码 public void moveFile( List<HmAnalysisFiles> hmAnalys…

Oracle OCP认证的技术定位怎么样?

一、引言&#xff1a;Oracle OCP认证的技术定位​ Oracle Certified Professional&#xff08;OCP&#xff09;认证是数据库领域含金量最高的国际认证之一&#xff0c;其核心价值在于培养具备企业级数据库全生命周期管理能力的专业人才。随着数字化转型加速&#xff0c;OCP认证…

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…

远程线程注入

注入简单来说就是让别人的程序执行 你想要让他执行的dll #include<iostream> #include<Windows.h> using namespace std;char szBuffer[] "C:\\Users\\20622\\source\\repos\\Dll1\\Debug\\test.dll"; //dll路径void RemoteThreadInject(DWORD Pid,PCH…

【Java实战】集合排序方法与长度获取方法辨析(易懂版)

一、排序方法 1. 对List排序的两种方式 方式一Collections.sort() List<Integer> numbers Arrays.asList(3,1,4,2); Collections.sort(numbers); // 直接修改原list → [1,2,3,4]方式二&#xff1a;list.sort()&#xff08;Java8推荐&#xff09; List<String>…

企业级安全实践:SSL/TLS 加密与权限管理(一)

引言 ** 在数字化转型的浪潮中&#xff0c;企业对网络的依赖程度与日俱增&#xff0c;从日常办公到核心业务的开展&#xff0c;都离不开网络的支持。与此同时&#xff0c;网络安全问题也日益严峻&#xff0c;成为企业发展过程中不可忽视的重要挑战。 一旦企业遭遇网络安全事…

Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Python编程基础(一) | 变量和简单数据类型

引言&#xff1a;很久没有写 Python 了&#xff0c;有一点生疏。这是学习《Python 编程&#xff1a;从入门到实践&#xff08;第3版&#xff09;》的课后练习记录&#xff0c;主要目的是快速回顾基础知识。 练习1&#xff1a; 简单消息 将一条消息赋给变量&#xff0c;并将其…

鸿蒙 HarmonyOS - SideBarContainer 组件自学指南

在日常开发中&#xff0c;如果你有类似「左侧导航 右侧内容」的布局需求&#xff0c;比如后台管理界面、文件管理器、设置页等&#xff0c;​​SideBarContainer​​ 是非常值得掌握的组件。它自带侧边栏和主内容区的分离机制&#xff0c;还支持折叠、拖拽、控制按钮和多种显示…

CppCon 2014 学习:Practical Functional Programming

这段内容是对**在 C 中使用函数式编程&#xff08;Functional Programming, FP&#xff09;**可以做什么的简要介绍&#xff0c;下面是逐条的翻译与理解&#xff1a; Introduction 简介 在 C 中使用函数式编程&#xff08;FP&#xff09;可以做什么&#xff1f; 1. 编写强大…

飞牛NAS+Docker技术搭建个人博客站:公网远程部署实战指南

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress总结 前言 在数字化浪潮中&#xff0c;传统网站搭建方式正面临前所未…

ComfyUI+阿里Wan2.1+内网穿透技术:本地AI视频生成系统搭建实战

文章目录 前言1.软件准备1.1 ComfyUI1.2 文本编码器1.3 VAE1.4 视频生成模型 2.整合配置3. 本地运行测试4. 公网使用Wan2.1模型生成视频4.1 创建远程连接公网地址 5. 固定远程访问公网地址总结 前言 各位技术爱好者&#xff0c;今天为您带来一组创新性的AI应用方案&#xff01…

n8n:技术团队的智能工作流自动化助手

在当前数字化时代,自动化已经成为提高效率和减轻人工工作负担的一大推动力。今天,我们要为大家介绍一款极具潜力的开源项目——n8n,它不仅拥有广泛的应用场景,还具备内置AI功能,能够完全满足技术团队的高效工作需求。n8n的出现,为技术团队提供了自由编程与快速自动化构建…