一、消息队列(MQ)概述
消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。
消息队列主要解决了应用耦合、异步处理、流量削锋等问题。
当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。
二、主流消息队列使用对比
综合表格对比
消息队列 | 事务 | 管理页面 | 可用性 | 消息重复 | 吞吐量 | 顺序消息 | 并发读 |
---|---|---|---|---|---|---|---|
Kafka | 支持 | 一般 | 非常高(分布式) | 支持at least once、at most once | 极大 Kafka按批次发送消息和消费消息。发送端将多个小消息合并,批量发向Broker,消费端每次取出一个批次的消息批量处理 | 支持 | 高 |
RabbitMQ | 支持 | 好 | 高(主从) | 支持at least once、at most once | 比较大 | 不支持 | 极高 本身是用Erlang语言写的,并发性能高。 |
ZeroMQ | 不支持 | 无 | 高 | 只有重传机制,消息丢失重传就失效 | 极大 | 不支持 | 高 |
RocketMQ | 支持 | 无 | 非常高(分布式) | 支持at least once | 大 rocketMQ接收端可以批量消费消息,可以配置每次消费的消息数,但是发送端不是批量发送 | 支持 | 高 |
ActiveMQ | 支持 | 一般 | 高(主从 | 支持at least once | 比较大 | 不支持 | 高 |
持久化比较
ActiveMq 、RabbitMq 和 Kafka都支持,ZeroMQ不支持持久化。持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了,消息不会丢失的机制。
三、最后
综上所述,RabbitMQ 和 Kafka是比较中表现是出色的,但RabbitMq 比 Kafka 成熟,在可用性上、稳定性上、可靠性上,RabbitMq 胜于 Kafka (理论上)。
另外,Kafka 的定位主要在日志等方面,因为Kafka 设计的初衷就是处理日志的,可以看做是一个日志(消息)系统一个重要组件,针对性很强,所以如果业务方面还是建议选择RabbitMq 。
详细对比可参考:<17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ 分布式消息队列>传送门