核心问题
你知不知道你们系统里为什么要用消息队列这个东西?
你既然用了消息队列这个东西,你知不知道用了有什么好处 & 坏处?
既然你用了 MQ,可能是某一种 MQ,那么你当时做没做过调研?
消息队列的好处
解耦
以前是我挨个通知大家吃饭(点对点调用),现在我在微信群里发消息,谁饿谁来看(MQ 发布订阅)。
各模块不再直接调用,降低耦合度,提高系统灵活性。
异步
同步是“亲自送到每家”;异步是“打包交给快递公司处理”,我只管发,快不快你们自己去搞,客户早就满意回家了。
提升响应速度,改善用户体验。
削峰
高峰期像大雨,水流太猛容易漫堤;MQ 就是水库,把水暂时蓄起来,慢慢放出去,保证下游河道不被冲垮。
平滑流量,保障系统稳定。
消息队列的缺点
系统可用性降低
系统越复杂,越容易崩溃,MQ 成为系统中新的单点故障风险。
系统复杂度提高
需要额外搭建、维护 MQ 服务,增加整体架构复杂度。
一致性挑战
异步消息导致数据一致性难以保证,需要设计额外机制确保消息不丢失、不重复、幂等处理(幂等指的是多次执行同一操作,结果和执行一次的结果是一样的)。
常见消息队列对比表格
特性
ActiveMQ
RabbitMQ
RocketMQ
Kafka
单机吞吐量
万级,低于 RocketMQ、Kafka
同 ActiveMQ
10 万级,支持高吞吐
10 万级,高吞吐,适合大数据实时计算和日志采集
Topic 数量对吞吐量影响
无明显数据
无明显数据
支持几百到几千个 topic,吞吐量仅小幅下降
topic 数量从几十到几百时吞吐量大幅下降,需要更多资源支持
时效性
毫秒级
微秒级,延迟最低
毫秒级
毫秒级以内
可用性
高,可主从架构实现高可用
同 ActiveMQ
非常高,分布式架构
非常高,分布式,数据多副本,少数节点宕机不影响整体可用
消息可靠性
低概率丢失
基本不丢失
参数优化后可做到零丢失
同 RocketMQ
功能支持
MQ 功能完备
基于 Erlang,性能优异,延迟低
功能完善,分布式,扩展性强
功能相对简单,主要支持大数据实时计算和日志采集
社区活跃度
较低
较高
中等,Apache 维护,社区活跃度一般
高,尤其在大数据生态中广泛应用
技术门槛
低
Erlang 语言限制,Java 团队掌控难度较大
Java 生态,技术门槛中等
Java/Scala 生态,门槛适中
适用场景
一般业务,老系统
中小型业务系统
大型分布式系统,高吞吐量场景
大数据实时处理、日志采集及流式计算
选型建议
场景类型
推荐 MQ
理由
中小型公司
RabbitMQ
稳定,社区活跃,性能良好
大型公司
RocketMQ
功能全面,扩展性强,适合高吞吐量场景
大数据相关场景
Kafka
优秀的吞吐与扩展能力,适合流数据处理
老旧系统
不推荐 ActiveMQ
社区不活跃,性能不足,技术更新滞后