@[toc]
主题(消息路由),子主题,分组订阅(共享订阅)
(1) 常见的主题形式以及定义
mqtt 常见的topic 形式举例
chat/room/1
sensor/10/temperature
sensor/+/temperature
$SYS/broker/metrics/packets/received
$SYS/broker/metrics/#
$queue/t/1
$share/abc/t/1
定义形式: 可以理解问文件式的分层结构: chat/root/1,主题是以 ”/“ 分割的
(2)子主题(解释下 ”+“ , ”#“ 通配符的使用)
通配符 ”+“ 的使用
'+': 表示通配一个层级,例如a/+,匹配a/x, a/y
'#': 表示通配多个层级,例如a/#,匹配a/x, a/b/c/d
'+' 表示 一个的占位 , client 订阅 a/+ 相当有订阅月 a/ ... 等主题, 可以如:
sensor/+/temperature 形式来订阅 sensor/未知主题/temperature 下的消息
通配符 ”#“ 的使用
'#' 表示 多个占位 ,client 订阅 a/# 相当于a 文件夹的子文件夹,以及子文件夹的子文件夹都会被订阅
(3) 分组订阅 (共享订阅)
定义:适用于消息让一个集群中只有一台机器消费的场景歌(基于mqtt 服务 EMQ 的,其他的中间件原理查不多)
示例 | 前缀 | 真实主题名 |
---|---|---|
$queue/t/1 | $queue/ | t/1 |
$share/abc/t/1 | $share/abc | t/1 |
群组订阅
以 $share/<group-name> 为前缀的共享订阅是带群组的共享订阅
group-name 可以为任意字符串,属于同一个群组内部的订阅者将以负载均衡接收消息,但 EMQ X 会向不同群组广播消息。
例如,假设订阅者 s1,s2,s3 属于群组 g1,订阅者 s4,s5 属于群组 g2。那么当 EMQ X 向这个主题发布消息 msg1 的时候:
EMQ X 会向两个群组 g1 和 g2 同时发送 msg1
s1,s2,s3 中只有一个会收到 msg1
s4,s5 中只有一个会收到 msg1
[s1]
msg1 /
[emqx] ------> "$share/g1/topic" - [s2] got msg1
| \
| [s3]
| msg1
----> "$share/g2/topic" -- [s4]
\
[s5] got msg1
不带群组订阅
以 share 订阅的一种特例,相当与所有订阅者都在一个订阅组里面
[s1] got msg1
msg1,msg2,msg3 /
[emqx] ---------------> "$queue/topic" - [s2] got msg2
\
[s3] got msg3
如图相当于消息只会被 一个机器节点 s1 | s2 | s3 消费而不会每个机器都给消息消费一次
EMQ 负载均衡配置与派发Ack 配置
# etc/emqx.conf
# 均衡策略
broker.shared_subscription_strategy = random
# 适用于 QoS1 QoS2 消息,启用时在其中一个组离线时,将派发给另一个组
broker.shared_dispatch_ack_enabled = false
更多EMQ 使用参照 EMQ官方文档
更多的mqtt 问题,欢迎查看专题下的其他文章查看 ,也欢迎留言,也可以加我微信 Yangting199306 备注 简书 一起讨论技术,也可以一起写文章
一起学Java ,跟强哥得永生,点赞关注 !!!