共享訂閱
共享訂閱是在多個訂閱者之間實現負載均衡的訂閱方式:
[subscriber1] got msg1
msg1, msg2, msg3 /
[publisher] ----------------> "$share/g/topic" -- [subscriber2] got msg2
\
[subscriber3] got msg3
上圖中,共享 3 個 subscriber 用共享訂閱的方式訂閱了同一個主題 share/g/ 是共享訂閱前綴。EMQ X 支持兩種格式的共享訂閱前綴:
類型 | 格式 | 示例 | 說明 |
---|---|---|---|
帶群組的共享訂閱 | $share/<group-name>/真實主題 | $share/abc/t/1 | 真實發布主題是t/1, 群組名為abc, 多個訂閱$share/abc/t/1的客戶端, 一個消息發布時只有一個客戶端能收到 |
不帶群組的共享訂閱 | $queue/真實主題 | $queue/t/1 | 以 |
帶群組的共享訂閱:
[s1]
msg1 /
[emqx] ------> "$share/g1/topic" - [s2] got msg1
| \
| [s3]
| msg1
----> "$share/g2/topic" -- [s4]
\
[s5] got msg1
例如,假設訂閱者 s1,s2,s3 屬于群組 g1,訂閱者 s4,s5 屬于群組 g2。那么當 EMQ X 向這個主題發布消息 msg1 的時候:
EMQ X 會向兩個群組 g1 和 g2 同時發送 msg1
s1,s2,s3 中只有一個會收到 msg1
s4,s5 中只有一個會收到 msg1
不帶群組的共享訂閱:
[s1] got msg1
msg1,msg2,msg3 /
[emqx] ---------------> "$queue/topic" - [s2] got msg2
\
[s3] got msg3
均衡策略與派發 Ack 配置
EMQ X 的共享訂閱支持均衡策略與派發 Ack 配置, 可以在emqx.conf文件中配置
# etc/emqx.conf
# 均衡策略
broker.shared_subscription_strategy = random
# 適用于 QoS1 QoS2 消息,啟用時在其中一個組離線時,將派發給另一個組
broker.shared_dispatch_ack_enabled = false
均衡策略 | 說明 |
---|---|
random | 在所有訂閱者中隨機選擇 |
round_robin | 按照訂閱順序 |
sticky | 一直發往上次選取的訂閱者 |
hash | 按照發布者 ClientID 的哈希值 |