开发者社区> y2hr4cjzssnlm> 正文

我的mqtt协议和emqttd开源项目个人理解(18) - 一个客户端sub很多主题和数据,出现宕机?使用本地共享订阅解决!

简介: 我的mqtt协议和emqttd开源项目个人理解(18) - 一个客户端sub很多主题和数据,出现宕机?使用本地共享订阅解决!
+关注继续查看

image.png


image.png

EMQ中CPU是公平分配给MQTT会话,大量pub消息到一个订阅,订阅不会拿到更多cpu,最终导致消息累积,内存溢出宕机。


最好的解决办法是分组订阅,把消息打散,多个客户端订阅。


问:请问一下,我现在的业务就是只使用一个sub,主题是\hello\#,去订阅数万个终端消息。请问针对这个问题,如何来优化业务逻辑?可以通过增加sub的方式吗?即把数万终端分成几个小组,每小组往一个主题pub,然后再分别订阅?


答:不需要自己实现,使用emq 2.x的本地+共享订阅相结合即可。使用主题:$local/$share/group/topic


http://emqtt.com/docs/v2/advanced.html#local-subscription


emq2.x版本,共享订阅只支持单节点,不支持集群。



---


关联阅读:我的mqtt协议和emqttd开源项目个人理解(24) - emq v2.3.11源码成熟度如何?


EMQ 2.3中的本地/共享订阅


简介


使用本地订阅后,指消息只在订阅者的本地(所连接的)EMQ节点,不会流传到集群中的其它EMQ节点中。在共享订阅中,订阅同一个主题的客户端会轮流的收到这个主题下的消息,也就是说同一个消息不会发送到多个订阅者,从而实现订阅端的多个节点之间的负载均衡。共享订阅对于数据采集/集中处理类应用非常有用。在这样的场景下,数据的生产者远多余数据的消费者,且同一条数据只需要被任意消费者处理一次。


EMQ中本地/共享订阅特性


本地订阅(Local Subscription)是指只在本节点创建订阅与路由表,不会在集群节点间广播全局路由。


mosquitto_sub  -t  '$local/topic'

mosquitto_pub  -t  'topic'

使用方式: 订阅者在主题(Topic)前增加‘$local/’前缀。


共享订阅(Shared Subscription)支持在多订阅者间采用分组负载平衡方式派发消息:




共享订阅支持两种使用方式:


订阅前缀 使用示例

$queue/ mosquitto_sub -t ‘$queue/topic’

$share/<group>/ mosquitto_sub -t ‘$share/group/topic’

其中$queue与$share的区别,在于$share后面可以加不同的分组(group),比如$share/group1/topic,$share/group2/topic,$share/group3/topic,生产者发一个topic的消息,订阅$share/group1/topic的消费者、$share/group2/topic的消费者、$share/group3/topic的消费者都能收到消息,如果一个分组中存在多个消费者,则多个消费者还会共享订阅消息,每个group的消息随机其中一个消费者能获得。





使用场景


当生产者和消费者的消息只想通过一个EMQ节点,可使用EMQ的本地订阅。

当消费者的消息想通过EMQ实现订阅端的多个消费者之间的负载均衡,则可使用EMQ的共享订阅。

特殊情况下,当多个生产者生产多条消息的时候,一个消费者压力会很大,分担一个消费者的压力,或者其它情况,需要用到本地共享订阅。本地共享订阅是本地订阅与共享订阅的组合。


下图为本地共享订阅的消息走向和订阅关系。每个消费者都必须本地共享订阅每一个EMQ节点,这样每条消息只会走向一个消费者。注意:这里的SUB指消费者,PUB指生产者。


消息流向


每个PUB的消息从经过LB(负载均衡),发送到不同的EMQ节点中,比如第一个EMQ节点收到的M1、M3、M4的消息:


通过本地订阅,这个EMQ节点的消息把收到的M1、M3、M4的消息不发给其它集群的EMQ节点,只从这个EMQ节点发送给订阅的SUB。

通过共享订阅,这个EMQ的消息把收到的M1、M3、M4的消息发送给不同的SUB端。

通过上述本地订阅+共享订阅,实现多个PUB发送的每条消息随机到达一个并且只有一个SUB。

订阅关系


每个SUB使用本地共享订阅($local/$share/A)来订阅EMQ集群中的每个EMQ节点。




 


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
我的mqtt协议和emqttd开源项目个人理解(18) - 一个客户端sub很多主题和数据,出现宕机?使用本地共享订阅解决!
我的mqtt协议和emqttd开源项目个人理解(18) - 一个客户端sub很多主题和数据,出现宕机?使用本地共享订阅解决!
101 0
艾伟也谈项目管理,敏捷个人:内容框架之执行力
  执行力是敏捷个人需要学习的一个内容,本篇主要介绍执行力相关的内容,大家在读后可以采用介绍的一些指南开始行动。 执行力的三个层面 按照命令和规则做事的过程,简单讲就是能够听话照做 按照预定的计划行为的过程,简单讲就是做事章法 将想法变成现实的过程,简单讲就是规划实现   对第一个层面来说,要做的事情是片段的、非连贯的,但对第二个层面来说是连续的、整体的。
909 0
艾伟也谈项目管理,个人管理:从昨天的一个设计评审来谈如何与人交流你的设计思路
  昨天项目组进行了一个设计评审,主要是对OpenExpressApp的AutoUI部分进行重构,我相当于评审人。大家也可以把这个评审过程当做与人交流你的设计思路的一个过程,以下从我评审的一些要素来谈谈与人交流设计思路时需要考虑的内容,也许对大家在实际工作中的架构、设计和沟通都有所帮助。
827 0
我的mqtt协议和emqttd开源项目个人理解(20) - 如果客户端clientid为空,emq会随机帮忙生成
我的mqtt协议和emqttd开源项目个人理解(20) - 如果客户端clientid为空,emq会随机帮忙生成
103 0
我的mqtt协议和emqttd开源项目个人理解(25) - 协议里面Clean Session为0和1的区别
我的mqtt协议和emqttd开源项目个人理解(25) - 协议里面Clean Session为0和1的区别
56 0
我的mqtt协议和emqttd开源项目个人理解(26) - 产品开发遇到的问题解答,关于订阅和上下线插件
我的mqtt协议和emqttd开源项目个人理解(26) - 产品开发遇到的问题解答,关于订阅和上下线插件
168 0
我的mqtt协议和emqttd开源项目个人理解(17) - [error] Dependency luerl is specified as a dependency but is not...
我的mqtt协议和emqttd开源项目个人理解(17) - [error] Dependency luerl is specified as a dependency but is not...
69 0
682
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载