@[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
定義形式: 可以理解問文件式的分層結(jié)構(gòu): chat/root/1,主題是以 ”/“ 分割的
(2)子主題(解釋下 ”+“ , ”#“ 通配符的使用)
通配符 ”+“ 的使用
'+': 表示通配一個(gè)層級(jí),例如a/+,匹配a/x, a/y
'#': 表示通配多個(gè)層級(jí),例如a/#,匹配a/x, a/b/c/d
'+' 表示 一個(gè)的占位 , client 訂閱 a/+ 相當(dāng)有訂閱月 a/ ... 等主題, 可以如:
sensor/+/temperature 形式來訂閱 sensor/未知主題/temperature 下的消息
通配符 ”#“ 的使用
'#' 表示 多個(gè)占位 ,client 訂閱 a/# 相當(dāng)于a 文件夾的子文件夾,以及子文件夾的子文件夾都會(huì)被訂閱
(3) 分組訂閱 (共享訂閱)
定義:適用于消息讓一個(gè)集群中只有一臺(tái)機(jī)器消費(fèi)的場(chǎng)景歌(基于mqtt 服務(wù) EMQ 的,其他的中間件原理查不多)
示例 | 前綴 | 真實(shí)主題名 |
---|---|---|
$queue/t/1 | $queue/ | t/1 |
$share/abc/t/1 | $share/abc | t/1 |
群組訂閱
以 $share/<group-name> 為前綴的共享訂閱是帶群組的共享訂閱
group-name 可以為任意字符串,屬于同一個(gè)群組內(nèi)部的訂閱者將以負(fù)載均衡接收消息,但 EMQ X 會(huì)向不同群組廣播消息。
例如,假設(shè)訂閱者 s1,s2,s3 屬于群組 g1,訂閱者 s4,s5 屬于群組 g2。那么當(dāng) EMQ X 向這個(gè)主題發(fā)布消息 msg1 的時(shí)候:
EMQ X 會(huì)向兩個(gè)群組 g1 和 g2 同時(shí)發(fā)送 msg1
s1,s2,s3 中只有一個(gè)會(huì)收到 msg1
s4,s5 中只有一個(gè)會(huì)收到 msg1
[s1]
msg1 /
[emqx] ------> "$share/g1/topic" - [s2] got msg1
| \
| [s3]
| msg1
----> "$share/g2/topic" -- [s4]
\
[s5] got msg1
不帶群組訂閱
以 share 訂閱的一種特例,相當(dāng)與所有訂閱者都在一個(gè)訂閱組里面
[s1] got msg1
msg1,msg2,msg3 /
[emqx] ---------------> "$queue/topic" - [s2] got msg2
\
[s3] got msg3
如圖相當(dāng)于消息只會(huì)被 一個(gè)機(jī)器節(jié)點(diǎn) s1 | s2 | s3 消費(fèi)而不會(huì)每個(gè)機(jī)器都給消息消費(fèi)一次
EMQ 負(fù)載均衡配置與派發(fā)Ack 配置
# etc/emqx.conf
# 均衡策略
broker.shared_subscription_strategy = random
# 適用于 QoS1 QoS2 消息,啟用時(shí)在其中一個(gè)組離線時(shí),將派發(fā)給另一個(gè)組
broker.shared_dispatch_ack_enabled = false
更多EMQ 使用參照 EMQ官方文檔
更多的mqtt 問題,歡迎查看專題下的其他文章查看 ,也歡迎留言,也可以加我微信 Yangting199306 備注 簡(jiǎn)書 一起討論技術(shù),也可以一起寫文章
一起學(xué)Java ,跟強(qiáng)哥得永生,點(diǎn)贊關(guān)注 !!!