当前位置: 首页 > news >正文

MQTT-共享订阅

共享订阅

在普通的订阅中,每发布一条消息,所有匹配的订阅端都会收到该消息。当某个订阅端的消费速度无法跟上消息的生产速度时,没有办法将其中一部分消息分流到其他订阅端来消费。这就使得订阅端容易成为整个消息系统的性能瓶颈。

在这里插入图片描述

  • 解决办法

MQTT 5.0 引入了共享订阅特性,它使得 MQTT 服务端可以在使用特定订阅的客户端之间均衡地分配消息负载。这表示,当我们有两个客户端共享一个订阅时,那么发布的消息都只投递给其中一个客户端。类似:订阅者集群,负载均衡,提高消费性能

订阅分类

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

前缀格式示例前缀真实主题名
群组格式$share/g/test/a$share/gtest/a
非群组格式$queue/test/a$queue/test/a
群组订阅

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

案例说明

订阅者 sub_1sub_2sub_3 是组 g1 的成员,订阅者 sub_4sub_5 是组 g2 的成员,而所有订阅者都订阅了原始主题 test/1。共享订阅的主题是 $share/g1/test/1$share/g2/test/1

当 EMQX 发布消息 msg1 到原始主题 test/1 时:

  • EMQX 将 msg1 发送给 g1g2 两个组。
  • sub_1sub_2sub_3 中的一个订阅者将接收 msg1
  • sub_4sub_5 中的一个订阅者将接收 msg1

在这里插入图片描述

案例演示

创建订阅者

  • sub_1
    • 主题 $share/g1/test/1

在这里插入图片描述

  • sub_2
    • 主题 $share/g1/test/1

在这里插入图片描述

  • sub_3
    • 主题 $share/g1/test/1

在这里插入图片描述

  • sub_4
    • 主题 $share/g2/test/1

在这里插入图片描述

  • sub_5
    • 主题 $share/g2/test/1

在这里插入图片描述

发布者发布消息

  • publish 发布消息
    • 主题 test/1

在这里插入图片描述

订阅者接收消息

  • g1 组 中 只有 sub_2 接收到

在这里插入图片描述

  • g2 组 中 只有 sub_5 接收到

在这里插入图片描述

非群组订阅

通过在原始主题前 添加 $queue/ 前缀为非群组订阅者启用共享订阅。它是 $share 订阅的一种特例,可以理解为所有订阅者都在一个订阅组

案例说明

订阅者 sub_queue_1sub_queue_2sub_queue_3 都订阅主题 $queue/test/q。原始主题为 test/q。 发布消息 msg1msg2msg3到原始主题 test/q 时,sub_queue_1sub_queue_2sub_queue_3 各自收到一个消息。

在这里插入图片描述

案例演示

创建订阅者

  • sub_queue_1
    • 主题 $queue/test/q

在这里插入图片描述

  • sub_queue_2
    - 主题 $queue/test/q

在这里插入图片描述

  • sub_queue_3
    • 主题 $queue/test/q

在这里插入图片描述

发布者发布消息

  • publish 发布消息
    • 主题 test/q
    • 连续发送三个消息
    • 三个订阅者各收到一条

在这里插入图片描述

订阅者接收消息

  • sub_queue_1

在这里插入图片描述
订阅者 sub_queque_1 收到 消息 3

  • sub_queue_2

在这里插入图片描述
订阅者 sub_queque_2 收到 消息 1

  • sub_queue_3

在这里插入图片描述
订阅者 sub_queque_3 收到 消息 2

负载均衡策略

可通过Dashboard进行负载均衡算法的配置【管理>>MQTT配置】

在这里插入图片描述

策略简介
  • 随机(Random)

在共享订阅组内随机选择一个会话发送消息。

  • 轮询(Round Robin)

在共享订阅组内按顺序选择一个会话发送消息,循环往复。

  • 哈希(Hash)

基于某个字段的哈希结果来分配。

  • 粘性(Sticky)

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

  • 本地优先(Local)

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

相关文章:

  • 分布式缓存:缓存设计中的 7 大经典问题_缓存失效、缓存穿透、缓存雪崩
  • 解码AI:2025年人工智能技术发展全景图
  • 信息收集与搜索引擎
  • 【案例篇】 实现简单SSM工程-后端
  • 开源轻量级语音合成和语音克隆模型:OuteTTS-1.0-0.6B
  • 黑马Java基础笔记-15
  • QTabWidget垂直TabBar的图标和文本水平显示
  • 【论文阅读】——D^3-Human: Dynamic Disentangled Digital Human from Monocular Vi
  • 前端流行框架Vue3教程:25. 组件保持存活
  • [创业之路-375]:企业战略管理案例分析 - 华为科技巨擘的崛起:重构全球数字化底座的超级生命体
  • WPF 全屏显示实现(无标题栏按钮 + 自定义退出按钮)
  • 2025软考架构师 DeepSeek 案例预测
  • 在WPF中添加动画背景
  • Android-OkHttp与Retrofit学习总结
  • 事务基础概念
  • HarmonyOS优化应用内存占用问题性能优化四
  • 奇好 PDF安全加密 + 自由拆分合并批量处理 OCR 识别
  • 常见嵌入式软件架构
  • JavaSE常用API之Runtime类:掌控JVM运行时环境
  • UDP和TCP示例程序
  • 淘宝网站的建设目标是/十大网站平台
  • 做私活的网站/百度下载安装2022最新版
  • 广西灵山县住房和城乡建设局网站/百度投诉电话客服24小时
  • 成绩分析智能网站怎么做/专业seo网络推广
  • 专门做正品的网站/站长统计ios
  • 物流公司网站开发与淘宝对接 在淘宝卖家中心显示物流信息/免费seo工具汇总