文章字数:817,阅读全文大约需要3分钟
高并发场景下,消息队列常用于流量削峰,解耦等作用。
基本标准
- 消息可靠,不丢失信息
- 支持集群
- 性能好,满足绝大部分要求。
- 开源,发现问题可以修改源码
- 社区活跃,用的人多大部分问题都能提前发现
RabbitMQ
使用
Erlang编写,最早是为电信行业系统之间通讯设计。支持AMQP
特点:
轻量级:轻量,开箱即用。容易部署和使用。Exchange:生产者和队列之间加入了一个根据路由规则分发消息到不同的队列的功能。客户端支持语言多:支持很多种客户端语言
不足
消息堆积支持不好:消息大量堆积性能急剧下降性能不好:每秒几万到十几万的数据量,比起其他几十万的(RabbitMQ)性能差一个数量级Erlang:使用Erlang语言,拓展性不好,二次开发成本高(相对于java)
RocketMQ
阿里巴巴2012年开源的,后来捐赠给
Apache。使用java开发,在阿里内部被广泛使用。
优点
性能稳定,可靠:性能稳定,可靠性高,功能齐全。中文社区活跃,使用java开发:社区活跃,使用java开发,拓展和二次开发比较容易。延迟低:业务响应延时做了优化,大多数情况下毫秒级响应。性能好:每秒能处理几十万条信息
劣势
与其它产品的集成和兼容性不足
kafka
期初是分布式日志提交系统
优点
兼容性好:大数据相关的开源软件都会优先支持Kafka性能高:性能比RocketMQ还好一点,也是每秒几十万数据。足够多的客户端并发异步批量发送,在开启压缩情况下极限处理能力达到2000万条。
不足
异步批量:异步批量的思想性能好,但是也带来延时较高的问题。
对比
| \ | kafka | RocketMQ | RabbitMQ |
|---|---|---|---|
| 单机吞吐量 | 十万级 | 十万级 | 万级 |
| 开发语言 | java & Scala | java | Erlang |
| 消息延迟 | 号码级 | 毫秒级 | 微秒级 |
| 消息丢失 | 参数配置后可以0丢失 | 参数配置后可以0丢失 | 极低概率丢失 |
| 消费模式 | Pull | Pull+Push | Pull+Push |
| topic数量对吞吐量影响 | topic几十几百时,吞吐量大幅下降 | topic几百几千时,小幅度下降 | \ |
| 可用性 | 非常高(分布式) | 非常高(主从) | 高(主从) |
| 总结 | 吞吐量高,分布高可用,支持较少topic数量 | 支持大规模topic数量 | 不支持集群动态扩容 |