如何订阅MQTT服务器历史消息,mqtt集群订阅如何只消费一个(一次)消息?
共享訂閱
在實踐中我們的業務系統集成是集群存在,對于mqtt消息,如果沒有做特殊處理,那么集群中每個服務只要訂閱了mqtt中的一個主題,那么每臺服務器都會進行消費。不僅浪費資源,還限制了服務的處理上限。
因此,有不少朋友在問這類問題:走MQTT協議,兩個訂閱者都訂閱同一個topic,向該topic發布一個消息,怎么只讓其中的訂閱者消費?
針對這個問題,筆者經過實踐發現,可以通過broker共享訂閱機制來解決此問題。
什么是共享訂閱
共享訂閱是在多個訂閱者之間實現負載均衡的訂閱方式:
[subscriber1] got msg1
msg1, msg2, msg3 /
[publisher] ----------------> "$share/g/topic" -- [subscriber2] got msg2
\
[subscriber3] got msg3
上圖中,共享 3 個 subscriber 用共享訂閱的方式訂閱了同一個主題?$share/g/topic,其中topic?是它們訂閱的真實主題名,而?$share/g/?是共享訂閱前綴。EMQ X 支持兩種格式的共享訂閱前綴:
如何實現共享訂閱
以emqx為例,可通過三方面來進行配置:
第一,配置emqx,開啟共享訂閱。
# etc/emqx.conf
# 均衡策略
broker.shared_subscription_strategy = random
# 適用于 QoS1 QoS2 消息,啟用時在其中一個組離線時,將派發給另一個組
broker.shared_dispatch_ack_enabled = true
在emqx.conf配置文件中,通過shared_subscription_strategy指定共享訂閱均衡策略。通過shared_dispatch_ack_enabled設置為true來開啟共享訂閱功能。
其中random表示在所有訂閱者中隨機選擇,round_robin表示按照訂閱順序,sticky表示一直發往上次選取的訂閱者,hash表示按照發布者 ClientID 的哈希值。
第二,消息發布。消息發布者與正常的消息發布一樣,比如定義了這樣一個topic路徑。
iot/equipment/heart
第三,消息訂閱
訂閱的時候通過添加$queue前綴或$share前綴進行共享訂閱。
$queue/iot/equipment/heart
// 或
$share/iot/equipment/heart
一定要注意,真是的topic是iot/equipment/heart,因此發布的時候只能用這個路徑。而訂閱時添加上$queue/或$share/前綴來表示是基于不帶群組的共享定義還是待群組的共享訂閱。
如果發布的主題直接添加上兩個前綴的一個,則消息是無法正常發送的。
關注公眾號:程序新視界,一個讓你軟實力、硬技術同步提升的平臺
除非注明,否則均為程序新視界原創文章,轉載必須以鏈接形式標明本文鏈接
總結
以上是生活随笔為你收集整理的如何订阅MQTT服务器历史消息,mqtt集群订阅如何只消费一个(一次)消息?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奶块哪种服务器人最多,奶块什么服务器人多
- 下一篇: css select-style属性,b