EMQ-共享订阅 【多个订阅者之间实现负载均衡的订阅方式】 概述和使用

共享订阅是在多个订阅者之间实现负载均衡的订阅方式:

####################### 生产者发布的主题名不变,只是订阅者订阅的主题前面要加上前缀 #######################

                                                   [subscriber1] got msg1
             msg1, msg2, msg3                    /
[publisher]  ---------------->  "$share/g/topic"  -- [subscriber2] got msg2
                                                 \
                                                   [subscriber3] got msg3

上图中,3 个订阅者用共享订阅的方式订阅了同一个主题 $share/g/topic,其中topic 是它们订阅的真实主题名,而 $share/g/ 是共享订阅前缀。EMQ X 支持两种格式的共享订阅前缀

订阅的主题名订阅主题前缀 发布的真实主题名
$queue/t/1$queue/t/1
$share/abc/t/1$share/abct/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

 

#不带群组的共享订阅

以 $queue/ 为前缀的共享订阅是不带群组的共享订阅。它是 $share 订阅的一种特例,相当与所有订阅者都在一个订阅组里面

                                       [s1] got msg1
        msg1,msg2,msg3               /
[emqx]  --------------->  "$queue/topic" - [s2] got msg2
                                     \
                                       [s3] got msg3

 

#均衡策略与派发 Ack 配置

EMQ X 的共享订阅支持均衡策略与派发 Ack 配置:

# etc/emqx.conf

# 均衡策略
broker.shared_subscription_strategy = random

# 适用于 QoS1 QoS2 消息,启用时在其中一个组离线时,将派发给另一个组
broker.shared_dispatch_ack_enabled = false
均衡策略描述
random在所有订阅者中随机选择
round_robin按照订阅顺序
sticky一直发往上次选取的订阅者
hash按照发布者 ClientID 的哈希值

无论是单客户端订阅还是共享订阅都要注意客户端性能与消息接收速率,否则会引发消息堆积、客户端崩溃等错误。


演示 带群组的共享订阅
生产者往  tupian/1 主题发送4条消息,3个订阅者 分别订阅 $share/g1/tupian/#,$share/g1/tupian/#,$share/g2/tupian/#
结果:属于g1组的两个订阅者,分别各得到2个消息
           属于g2组的1个订阅者,得到4个消息
           因为消息会同时发到 g1组 和 g2组



演示 不带群组的共享订阅
生产者往  tupian/1 主题发送4条消息,3个订阅者 都订阅 $queue/tupian/#
结果:每个订阅者都可以收到一部分信息,以负载均衡的方式接收消息
           因为这种是 $share 订阅的一种特例,相当与所有订阅者都在一个订阅组里面

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值