rabbitmq_mqtt插件单队列性能瓶颈优化

本文介绍了在RabbitMQ中使用MQTT插件遇到的单队列性能瓶颈,并分析了原因是MQTT插件在qos1下将消息持久化。通过修改插件源码,禁用qos1时的消息持久化,成功将TPS从1.6w/s提升至4w/s,解决了性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、说明

 1.1、场景

        为了搞个支持高并发、低延时的基础消息平台,同时要支持js端,造成了现有开源软件选择面太窄,在评估了rabbmitmq、emqtt、activemq、rocketmq后,综合考虑选择了RabbitMQ作为消息中间件,为啥要选RabbitMQ呢,RabbitMQ社区活跃久经沙场、除了AMQP消息协议外支持通过插件方式同时支持MQTT、STOMP协议同时各协议能互通、高性能、支持集群等等综合性原因,选择了它。

        在使用方面作为要支持网页端消息基础平台,由于RabbitMQ原生的AMQP协议官方不提供基于websocket的网页端支持,选择了使用MQTT协议作为消息通讯协议。在qos1的情况下,使用如下两种类测试用例:


        测试结果表明单个topic的consumer客户端TPS达到1.6w/s时,大量的消息处于unconfirmed状态堵塞在服务端,导致publish发送消息堵塞,发送时延极速增加(达到10多秒),TPS此时已经达到上限无论是新增publish客户端还是新增consumer客户端都无法增加消费的TPS,如下:


        由于要基于单个topic的消息路由瞬间大量并发低延时的消息平台来说,这点TPS是不够用,虽然此问题可以通过将消息分散到不同的topic来进行分散处理但是这增加了软件的复杂度和管理难度。

1.2、原因分析

        之前有基于AMQP协议对RabbitMQ进行性能测试,上述场景单队列单consumer

### MQTT协议性能限制与瓶颈分析 MQTT(Message Queuing Telemetry Transport)协议是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网场景中。尽管其设计初衷是为了适应低带宽、低功耗和高可靠性环境,但在实际部署和使用过程中,仍然存在一些性能限制和潜在瓶颈。 #### 1. 协议转换带来的性能损耗 在某些部署中,MQTT协议通过插件方式运行在基于AMQP协议的消息中间件(如RabbitMQ)上。由于需要进行协议转换,性能会受到显著影响。例如,在相同测试环境下,基于AMQP的RabbitMQ单队列单消费者场景中可以达到每秒处理5万条消息(TPS)以上,而使用MQTT插件进行协议转换时,性能下降明显。这表明协议转换过程可能引入额外开销,导致性能瓶颈[^3]。 #### 2. QoS等级对性能的影响 MQTT支持三种服务质量等级(QoS):QoS 0(最多一次)、QoS 1(至少一次)和QoS 2(恰好一次)。更高的QoS等级意味着更强的消息传递保障,但也伴随着更多的资源消耗和延迟增加。例如,QoS 2需要四次握手来确保消息精确传输一次,这在网络带宽受限或延迟敏感的场景中可能成为性能瓶颈[^5]。 #### 3. 网络带宽与消息大小的限制 虽然MQTT是轻量级协议,但其消息头相对较小,适合小数据量的频繁传输。然而,当需要传输大量数据或频繁发送消息时,网络带宽可能成为瓶颈。此外,MQTT的消息体通常采用明文格式,虽然支持压缩,但在未压缩情况下可能导致不必要的带宽消耗,尤其是在大规模设备同时通信的场景中[^4]。 #### 4. 主题层级与订阅管理的复杂性 MQTT采用主题(Topic)作为消息路由的核心机制,客户端通过订阅特定主题来接收消息。当系统中存在大量主题和订阅关系时,代理(Broker)需要维护复杂的订阅树结构,可能导致性能下降。特别是在大规模物联网部署中,主题管理的复杂性可能影响整体系统吞吐量和响应时间。 #### 5. Broker的可扩展性问题 MQTT性能瓶颈也与Broker的架构密切相关。单点Broker在面对海量设备连接和高并发消息处理时,可能成为性能瓶颈。虽然可以通过集群或负载均衡方式扩展,但这也增加了系统复杂性和运维成本。此外,跨数据中心或跨区域的消息传输可能引入额外延迟,影响实时性要求高的应用[^1]。 #### 6. 安全机制带来的开销 MQTT支持TLS加密、身份验证和访问控制等安全机制。虽然这些机制提升了通信安全性,但也带来了额外的计算开销和延迟。在资源受限的设备上,加密和解密操作可能成为性能瓶颈,尤其是在需要频繁建立和维持安全连接的场景中。 ### 示例:MQTT客户端连接与发布消息 ```python import paho.mqtt.client as mqtt # 创建客户端实例 client = mqtt.Client(client_id="sensor_001") # 连接到MQTT代理 client.connect("broker.hivemq.com", 1883, 60) # 发布消息到主题 client.publish("sensors/temperature", payload="25.5", qos=1) ``` ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值