1、RocketMQ
1.1 主要特性
1.1.1 基于队列模型:具有高性能、高可靠、高实时、分布式等特点
1.1.2 Producer、Consumer、队列都支持分布式
1.1.3 Producer向一些对垒轮流发送消息,队列集合称为Topic。Consumer如果做广播消费,则一个Consumer实例消费这个Topic对应的所有队列;如果做集群消费,则多个Consumer实例平均消费这个Topic对应的队列集合
1.1.4 能够保证严格的消息顺序
1.1.5 丰富的消息拉取模式
1.1.6 高效的订阅者水平扩展能力
1.1.7 亿级消息堆积能力
1.1.8 提供针对消息的过滤功能
1.2 优点
1.2.1 单机支持1万以上持久化队列
1.2.2 RocketMQ的所有消息都是持久化的,先写入系统PAGECACHE, 然后刷盘,可以保证内存与磁盘都有一份数据,而访问时直接从内存读取。
其他优点跟其它消息中间件都大同小异,这里不再列举
1.3 缺点
1.3.1 支持的客户端语言不多,目前是Java及C++
1.3.2 RocketMQ的社区关注度不及RabbitMQ和kafka
1.3.3 没有Web管理界面,提供了一个CLI(命令行界面)管理工具来查询、管理和诊断各种问题
1.3.4 没有在MQ核心里实现JMS等接口
2、RabbitMQ
2.1 主要特性
2.1.1 可靠性:提供了多种模式,可根据实际情况在性能与可靠性之间进行权衡
2.1.2 灵活路由:消息在到达队列前是通过交换机进行路由的;RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。
2.1.3 消息集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起作为一个独立的逻辑代理来使用
2.1.4 队列高可用:队列可以在集群中的机器上进行镜像,以确保在硬件问题下还保证消息安全
2.1.5 支持多种队列协议
2.1.6 支持多种语言:用Erlang语言编写,支持所有编程语言
2.1.7 管理界面:RabbitMQ提供独立的用户管理界面,可以监控和管理消息Broker的许多方面
2.1.8 跟踪机制:如果消息异常,RabbitMQ提供消息跟着机制,可以找出发生了什么
2.1.9 插件机制:提供了许多插件,可以多方面扩展
2.2 优点
2.2.1 由于Erlang语言的特性,消息队列性能较好,支持高并发
2.2.2 健壮、稳定、易用、跨平台、支持多种语言、文档齐全
2.2.3 有消息确认机制和持久化机制,可靠性高
2.2.4 高度可定制的路由
2.2.5 管理界面较丰富,在互联网公司也有较大规模的应用,社区活跃度高
2.3 缺点
2.3.1 Erlang语言本身有并发优势,性能较好,但不利于做二次开发和维护
2.3.2 实现了代理架构,使得期效率相对较低
3、Kafka
3.1 主要特性
3.1.1 快速持久化:通过磁盘顺序读写与零拷贝机制
3.1.2 高吞吐:在一台普通的服务器上就可以达到10w/s的吞吐速率
3.1.3 完全的分布式系统:Broker、Producer和Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡
3.1.4 高堆积:支持topic下消费者较长时间离线,消息堆积量大
3.1.5 支持Hadoop数据并行加载
3.1.6 支持同步和异步复制两种高可用机制
3.1.7 支持数据批量发送和拉取
3.1.8 无需停机即可扩展机器
3.2 优点
3.2.1 客户端语言丰富:支持Java、.Net、PHP、Ruby、Python、Go等多种语言
3.2.2 高性能:单机写入TPS约在100万条/秒,消息大学10个字节
3.2.3 提供完全分布式架构,并有replica机制,拥有较高的可用性和可靠性,理论上支持消息无限堆积
3.2.4 支持批量操作
3.2.5 消费者采用Pull方式获取消息,消息有序,通过控制能够保证所有消息仅被消费一次
3.3 缺点
3.3.1 Kafka单机超过64个队列/分区时,Load时会发生明显的飙高现象。队列越多,负载越高,发送消息响应时间变长
3.3.2 使用短轮询方式,实时性取决于轮询间隔时间
3.3.3 消息失败不支持重试
3.3.4 支持消息顺序,但一旦一台代理宕机后,就会产生消息乱序
3.3.5 社区更新较慢