消息队列是分布式系统中重要的中间件, 在高性能,高可用,低耦合等系统框架中扮演着重要的角色. 分布式系统可以借助消息队列轻松实现以下功能:
- 解耦:将一个流程的上下游解开,上游专注生产消息,下游专注消费消息.
- 广播:上游生产的消息可以轻松被下游服务处理.
- 削峰:应对突如其来的流量,消息队列扮演者缓冲的作用.保护下游服务,可以根据自己的消费能力来处理消息.
- 异步:用户发来的请求可以马上返回,不需要多余的等待,后台异步处理消息就行.
- 冗余:保存历史,处理失败或者异常时可以重试或者回溯,防止丢失.
一 MQ分类
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
公司 社区 | Apache | Rabbit | 阿里 | Apache |
开发语言 | Java | Erlang | Java | Scala&Java |
可用性 | 高(主从) | 高(主从) | 非常高(分布式) | 很高(分布式) |
支持协议 | 0penwire STOMP REST XMPP AMQP | AMQP XMPP SMTR STOMP | 自定义协议 | 自定义协议 |
单机吞吐量 | 万级 | 万级 | 单机万级 | 十万级 |
消息延迟 | 毫秒级 | 微秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 一般 | 高 | 高 | 一般 |
API完备性 | 高 | 高 | 低(静态配置) | 高 |
消息丢失 | - | 低 | 理论上不会丢失 | 理论上不会丢失 |
消息重复 | - | 可控制 | 允许重复 | 理论上会有重复 |
文档的完备性 | 高 | 高 | 中 | 高 |
提供快速入门 | 有 | 有 | 无 | 有 |
首次部署难度 | - | 低 | 高 | 中 |
部署方式 | 独立、嵌入 | 独立 | 独立 | 独立 |
PRODUCER-COMSUMER | 支持 | 支持 | 支持 | 支持 |
PUBLISH-SUBSCRIBE | 支持 | 支持 | 支持 | 支持 |
REQUEST-REPLY | 支持 | 支持 | 支持 | - |
授权方式 | 开源 | 开源 | 开源 | 开源 |
持久化 | 内存、文件、数据库 | 内存、文件 | 磁盘文件 | 内存、文件 |
二 优缺点
消息队列 | 优点 | 缺点 |
RabbitMQ | 1.支持AMQP协议 2.基于erlang语言开发 ,高并发性能较好 3.工作模式较为灵活 4.支持延迟消息 5.提供较为友好的后台管理页面 6.单机部署 ,1~2WTPS | 1.不支持水平扩容 2.消息吞吐量三者最差 3.当产生消息堆积 ,性能下降明显 4.消息重发机制需要手动设置 5.不支持消息重复消费 |
RocketMQ | 1.高可用 ,高吞吐量 ,海量消息堆积 ,低延迟性能上 ,都表现出色 | 1.生态圈相较Kafka有所不如 2.消息吞吐量与消息堆积能力也不如Kafka 3.不支持主从自动切换 4.只支持Java |
Kafka | 1.高可用 ,高吞吐量 ,低延迟性能上 ,都表现出色 2.使用人数多 ,技术生态圈完善 3.支持顺序消息 4.支持多种客户端 5.支持重复消费 | 1.依赖分区 ,消费者数量受限于分区数 2.单机消息过多时 ,性能下降明显 3.不支持事务消息 4.不支持指定次数和时间间隔的失败消息重发 |
ActiveMQ | 1.单机吞吐量过万. 2.时效性ms级. 3.可用性高. 4.支持持久化到数据库 | 1.非常古老的MQ了 2.官方社区现在对 ActiveMQ 5.x 维护越来越少 3.不够轻巧(源代码比RocketMQ多) 4.对队列数较多的情况支持不好 |
三 如何选择
MQ | 描述 |
RabbitMQ | erlang开发,对消息堆积的支持并不好,当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降,每秒钟可以处理几万到十几万条消息。 |
RocketMQ | java开发,面向互联网集群化功能丰富,对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,每秒钟大概能处理几十万条消息。 |
Kafka | Scala开发,面向日志功能丰富,性能最高,当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高,所以,Kafka 不太适合在线业务场景。 |
ActiveMQ | java开发,简单,稳定,性能不如前面三个,小型系统用也ok,但是不推荐,推荐用互联网主流的。 |
四 建议
- Kafka 被称为大数据的杀手锏, 谈到大数据的消息传入 ,则绕不开Kafka. 以百万级TPS 名声大造. 成为了大数据领域的宠儿. 不过对于一些追求高吞吐量, 大型公司可以考虑.
- RocketMQ 阿里巴巴产品, 用java语言实现的. 设计时参考了Kafka . 并在其做了自己的改进. 被阿里广泛应用. 扩展性好,支持 10 亿级别的消息堆积. 对于一些可靠性要求高的场景,建议选择.
- RabbitMQ 2007年发布, 是当前主流消息中间件之一. 由于 erlang 语言的高并发特性,性能较好; 吞吐量到万级MQ 功能比较完备,健壮、稳定、易用、跨平台、 支持多种语言. 对于技术一般的可以考虑.
- ActiveMQ 因为太老了,不多说.
如果看完该文章, 不知道什么是MQ ,为什么要用MQ的可以阅读一下👇为什么要用MQ? MQ到底有什么用? (带图详解).