一、说明

1、物联网项目,使用mqtt较多

2、一般小项目都是用emqx作为mqtt的服务

3、集群情况下,需要保证只有一次消费

4、考虑性能或者业务场景,可能需要用到延迟发布

5、windows端,准备mqttx,用于测试;MQTTX链接

https://www.emqx.com/zh/downloads/MQTTX

6、可以使用自建的emqx服务,也可以使用emqx开放的公共服务

broker.emqx.io
1883

~~

二、共享订阅

1、共享订阅,一般用于消费者为集群服务时,建立共享组,确保消息只被消费一次。

2、单机服务情况下,一个生产者对应一个消费者;当数据量达到一定程度时,消费者可能就需要扩展;即一个生产者多个消费者;emqx共享订阅是支持负载均衡的,所以在实际业务场景中,共享订阅或共享组是经常用到的。

3、共享组的topic在在订阅有所区别

4、首先明确,共享订阅分为两种

        1) 不带组的共享订阅,topic存在前缀 $queue

        2) 带分组的共享订阅,topic存在前缀 $share/${groupName}

        说明: 不带组的共享订阅其实是带分组的共享订阅的一种特例,即把所有的订阅者放到了一个组

5、举例-$queue

        1)发布者topic(推数据)

hg/001
hg/002

说明1:001,002为业务ID

        2)订阅者(消费数据)

$queue/hg/001
$queue/hg/002

        3)示例图

        说明1: mqttx一个连接,订阅topic唯一;所以需要建立多个mqtt连接,用于模拟多个发布者或订阅者

        说明2: 发布者,只需要往topic发数据即可;订阅者使用共享订阅,在topic前面增加"$queue/“前缀即可

        说明3: 带分组订阅也是如此;不过前缀不同;即发布者,只需往topic发数据即可;订阅者需要增加topic前缀"$share/${groupName}

        说明4: 带分组共享订阅,保证的是在组内多个订阅者中,消费一次。

        说明5: 如果只是确保消费集群仅消费一次,使用$queue即可;也可以使用唯一的$share

        说明6: $share多个群组的使用场景

                1)消息冗余备份,组A用于业务处理,组B用于消息备份不用于业务处理;

                2)举例:生产者发送消息msg,若此时有$share/g1与$share/g2两个群组,那么,订阅$share/g1与订阅$share/g2均会收到消息msg;多个g1订阅者仅一个会收到;多个g2订阅者仅一个收到;即emq会将消息广播到多个群组,群组内保证消息仅被消费一次。

        4)示例图-$share

        说明1: 发布者topic: hg/002

        说明2: 订阅者topic: $share/g1/hg/002

        说明3: g1即分组名称,可以自定义

        说明4: emqx默认为广播方式,即多个订阅者时,所有订阅者都会消费消息;分组订阅目的是为了解决多个订阅者时,消息仅被消费一次

 ~~

三、延迟发送

1、如果分组订阅指的是订阅者操作;那么延时发送就是发布者操作

2、延时发布依赖emqx的插件:emqx_mod_delayed

3、对比即理解

1)正常发布topic

hg/002

2)10秒后发布

 $delayed/10/hg/002

3)2分钟后发布

 $delayed/120/hg/002

说明1: 发布者通过增加前缀实现延时发布的效果

说明2: 单位即,秒

~~

四、分组订阅示例

0、示例说明

1)客户端工具使用mqttx

https://www.emqx.com/zh/downloads/MQTTX

2)mqtt服务使用开放的emqx服务

broker.emqx.io
1883

~~

1、普通订阅(1生1订)

1)1个生产者,1个订阅者

2)生产者topic

hg/demo

3)订阅者topic

hg/demo

4)示例截图

说明1: 发送与接收OK

2、普通订阅(1生多订)

1)1个生产者,多个订阅者

 2)生产者topic

hg/demo

3)订阅者topic

hg/demo

4)示例截图

说明1: 多个订阅,均会收到消息(区别与分组订阅)

说明2: 使用mqttx时,创建多个client用多个name区分即可

 ~~

 3、分组订阅(queue)

1)需要多个订阅者(至少2个)

2)生产者topic

hg/group1

3)订阅者

$queue/hg/group1

4)示例截图

说明1:  分组内,保证仅一个订阅者收到消息(区别与普通订阅)

说明2:一般用于订阅者集群时使用(确保唯一消费)

~~

4、分组订阅(多分组share)

1)需要多个订阅者(2个,1个订阅分组1+订阅分组2,另1个订阅分组1)

2)生产者topic

demo
3)订阅分组1
$share/hg2/demo

4)订阅分组2

$share/hg3/demo

5)示例截图01

 

说明1: 客户端01,订阅两个分组;未接收到消息

说明2: 客户端02,订阅hg2分组,收到消息

说明3: 客户端03,订阅hg3分组,收到消息

结论: 分组内,多个订阅者,保证唯一消费者;分组间,广播

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐