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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 我的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节点。




 


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
打赏
0
1
0
0
23
分享
相关文章
商业版vs开源版:一图看懂云消息队列 RocketMQ 版核心优势
自建开源 RocketMQ 集群,为保证业务稳定性,往往需要按照业务请求的峰值去配置集群资源。云消息队列 RocketMQ 版 Serverless 实例通过资源快速伸缩,实现资源使用量与实际业务负载贴近,并按实际使用量计费,有效降低企业的运维压力和使用成本。
322 18
4步实现状态机驱动的MQTT客户端,快速接入OneNet (1)
本文介绍了基于状态机驱动的MQTT客户端快速接入OneNet平台的实现方法,通过4步完成模块设计。文章以开源项目`Sparrow`为基础,引入`OneNetMqtt`业务模块,采用事件驱动模型和双层状态机设计,实现设备状态管理、消息处理及定时任务等功能。模块分为三层:`OneNetManager`负责核心逻辑,`OneNetDevice`管理设备信息,`OneNetDriver`处理Socket与MQTT通信。验证结果显示设备连接、数据上报及下线功能正常,稳定性良好。该设计简化了复杂条件判断,增强了系统灵活性与可扩展性,适用于实际项目参考。文末提供源码获取方式,助力读者实践与学习。
60 13
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
【有奖实践】轻量消息队列(原 MNS)订阅 OSS 事件实时处理文件变动
当你需要对对象存储 OSS(Object Storage Service)中的文件变动进行实时处理、同步、监听、业务触发、日志记录等操作时,你可以通过设置 OSS 的事件通知规则,自定义关注的文件,并将 OSS 事件推送到轻量消息队列(原 MNS)的队列或主题中,开发者的服务即可及时收到相关通知,并通过消费消息进行后续的业务处理。
轻量消息队列(原 MNS)订阅 OSS 事件实践
使用轻量消息队列订阅OSS事件,实时处理文件变动,赢取ins风U型枕(限量500个)。访问活动页面,完成实操并上传截图即可参与领奖。活动时间:即日起至2025年2月28日16:00。奖品数量有限,先到先得,快来报名吧!
恭喜 Apache RocketMQ、Apache Seata 荣获 2024 开源创新榜单“年度开源项目”
近日,以“新纪天工、开物焕彩——致敬开源的力量”为活动主题的“重大科技成就发布会(首场)”在国家科技传播中心成功举办,并隆重揭晓了 2024 开源创新榜单,旨在致敬中国开源力量,传播推广开源科技成就,营造中国开源创新生态。2024 年开源创新榜单由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办,中国开发者社区承办,以王怀民院士为首组建评审委员会,进行研讨评审,面向中国开源行业领域,遴选具有创新性、贡献度和影响力的开源项目、社区、应用场景与开源事件。在评审出的 10 个年度开源项目中,Apache RocketMQ、Apache Seata 成功入选。
118 17
通过轻量消息队列(原MNS)主题HTTP订阅+ARMS实现自定义数据多渠道告警
轻量消息队列(原MNS)以其简单队列模型、轻量化协议及按量后付费模式,成为阿里云产品间消息传输首选。本文通过创建主题、订阅、配置告警集成等步骤,展示了该产品在实际应用中的部分功能,确保消息的可靠传输。
95 2
FreeMQTT:一款Python语言实现的开源MQTT Server
FreeMQTT 是一款用 Python 语言并基于 Tornado 开发的开源 MQTT 服务器,支持 MQTT3.1.1 和 MQTT5.0 协议,提供多租户安全隔离、高效 Topic 匹配算法及实时上下线通知等功能,适用于 IoT 场景。快速启动仅需克隆仓库、安装依赖并运行服务。
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
470 16
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
150 15