第十四章 MQTT订阅

news2025/6/2 21:35:06

系列文章目录

系列文章目录
第一章 总体概述
第二章 在实体机上安装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,其中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

2、创建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),在共享订阅组内随机选择一个会话发送消息,此后保持这一选择,直到该会话结束再重复这一过程。

6、本地优先(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、在sub2客户端连接中重新添加$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.coloradmin.cn/o/2394011.html

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

相关文章

腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务

5月28日&#xff0c;腾讯云开发 CloudBase 宣布推出 AI Toolkit&#xff08;CloudBase AI Toolkit&#xff09;&#xff0c;这是国内首个面向智能编程的后端服务&#xff0c;适配 Cursor 等主流 AI 编程工具。 云开发 AI Toolkit旨在解决 AI 辅助编程的“最后一公里”问题&…

前端-不对用户显示

这是steam的商店偏好设置界面&#xff0c;在没有被锁在国区的steam账号会有5个选项&#xff0c;而被锁在国区的账号只有3个选项&#xff0c;这里使用的技术手段仅仅在前端隐藏了这个其他两个按钮。 单击F12打开开发者模式 单击1处&#xff0c;找到这一行代码&#xff0c;可以看…

WPF【10_2】数据库与WPF实战-示例

客户预约关联示例图 MainWindow.xaml 代码 <Window x:Class"WPF_CMS.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d"ht…

Cursor奇技淫巧篇(经常更新ing)

Dot files protection &#xff1a;Cursor当开启了Agent模式之后可以自动帮我们写文件&#xff0c;但是一般项目中的一些配置文件&#xff08;通常以.开头的&#xff09;都是非常重要性&#xff0c;为了防止Cursor在运行的过程中自己修改这些文件&#xff0c;导致风险&#xff…

Unity3D仿星露谷物语开发58之保存时钟信息到文件

1、目标 保存当前的时钟信息到文件中。 2、修改TimeManager对象 TimeManager对象添加组件&#xff1a;Generate GUID 3、修改SceneSave.cs脚本 添加1行代码&#xff1a; 4、修改TimeManager.cs脚本 添加&#xff1a; using System; 修改TimeManager类&#xff1a; 添加属…

lstm 长短期记忆 视频截图 kaggle示例

【官方双语】LSTM&#xff08;长短期记忆神经网络&#xff09;最简单清晰的解释来了&#xff01;_哔哩哔哩_bilibili . [short,input]*[2.7,1.63]b5.95 换参数和激活函数 tan激活函数输出带正负符号的百分比 tanx公式长这样&#xff1f; 潜在短期记忆 前几天都是乱预测&#xf…

Spring Advisor增强规则实现原理介绍

Spring Advisor增强规则实现原理介绍 一、什么是 Advisor&#xff1f;1. Advisor 的定义与本质接口定义&#xff1a; 2. Advisor 的核心作用统一封装切点与通知构建拦截器链的基础实现增强逻辑的灵活组合 二. Sprin当中的实现逻辑1 Advisor 接口定义2 PointcutAdvisor 接口定义…

【HarmonyOS 5】鸿蒙中的UIAbility详解(二)

【HarmonyOS 5】鸿蒙中的UIAbility详解&#xff08;二&#xff09; 一、前言 今天我们继续深入讲解UIAbility&#xff0c;根据下图可知&#xff0c;在鸿蒙中UIAbility继承于Ability&#xff0c;开发者无法直接继承Ability。只能使用其两个子类&#xff1a;UIAbility和Extensi…

力扣HOT100之动态规划:152. 乘积最大子数组

这道题并不是代码随想录里的&#xff0c;我试着用动规五部曲来做&#xff0c;然后不能通过全部测试样例&#xff0c;在第109个测试样例卡住了&#xff0c;如下所示。 原因是可能负数乘以负数会得到最大的乘积&#xff0c;不能单纯地用上一个序列的最大值乘以当前值来判断是否能…

定制开发开源AI智能名片S2B2C商城小程序:数字营销时代的话语权重构

摘要&#xff1a;在数据驱动的数字营销时代&#xff0c;企业营销话语权正从传统媒体向掌握用户数据与技术的平台转移。本文基于“数据即权力”的核心逻辑&#xff0c;分析定制开发开源AI智能名片S2B2C商城小程序如何通过技术赋能、场景重构与生态协同&#xff0c;帮助企业重构营…

【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)

目录 背景轨迹回放 - 匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 轨迹回放 - 非匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 背景 腾讯地图轨迹回放是匀速回放的&#xff0c;但是客户要求根据现实时间&#xff0c;什么时间点在某个点位 【腾讯地图轨…

利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法

参阅&#xff1a;Top 创新大奖 这个课题将农业废弃物资源化利用、计算机辅助药物设计和绿色化学完美结合&#xff0c;是一个极具创新性和应用前景的研究方向&#xff01; 以下是如何利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法的系统思路&#xff1a; 核心思路 玉…

【Docker】存储卷

【简介】 宿主机的某一目录与容器中的某一目录建立的一种绑定关系&#xff0c;这就是“存储卷” 它有三个特性 1.它可以绕过联合文件系统&#xff0c; 直接作用于宿主机的目录 2.容器和宿主机的这一绑定关系指向了同一目录&#xff0c; 因此两个目录之间的数据是同步的&#xf…

OpenCV图像认知(二)

形态学变换&#xff1a; 核&#xff1a; 核&#xff08;kernel&#xff09;其实就是一个小区域&#xff0c;通常为3*3、5*5、7*7大小&#xff0c;有着其自己的结构&#xff0c;比如矩形结构、椭圆结构、十字形结构&#xff0c;如下图所示。通过不同的结构可以对不同特征的图像…

t015-预报名管理系统设计与实现 【含源码!!!】

项目演示地址 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装预报名管理系统软件来发挥其高效地信息处理的…

LLM中的Loss与Logits详解

LLM中的Loss与Logits详解 自己构建的logits的损失函数,比自带loss效果好很多,建议自己构建; 另外学习率也是十分重要的参数,多次尝试,通过查看loss的下降趋势进行调整; 举例,来回跳跃说明下降率过大,一般从0.0001 开始尝试。 在深度学习中,logits 和 loss 是两个不…

数学术语之源——绝对值(absolute value)(复数模?)

目录 1. 绝对值&#xff1a;(absolute value): 2. 复数尺度(复尺度)&#xff1a;(modulus): 1. 绝对值&#xff1a;(absolute value): 一个实数的绝对值是其不考虑(irrespective)符号的大小(magnitude)。在拉丁语中具有相同意思的单词是“modulus”&#xff0c;这个单词还…

亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)

一、数据爬取模块&#xff08;Python示例&#xff09; import requests from bs4 import BeautifulSoup import pandas as pd import timeheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Accept-Language: en-US }def scrape_amazon_re…

OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局

【AI安全警钟再响&#xff0c;这次主角竟是OpenAI&#xff1f;】 当全球AI圈还在为Claude 4的“乖巧”欢呼时&#xff0c;OpenAI最新模型o3却以一场惊心动魄的“叛逃”测试引爆舆论——在100次关机指令测试中&#xff0c;o3竟7次突破安全防护&#xff0c;甚至篡改底层代码阻止系…

Bootstrap:精通级教程(VIP10万字版)

一、网格系统:实现复杂响应式布局 I. 引言 在现代 Web 开发领域,构建具有视觉吸引力、功能完善且能在多种设备和屏幕尺寸上无缝运行的响应式布局至关重要。Bootstrap 作为业界领先的前端框架,其核心的网格系统为开发者提供了强大而灵活的工具集,用以高效创建复杂的响应式…