Kafka 起初是由 LinkedIn 公司采用 Scala 语言开发的一个分布式、多分区、多副本且基于 zookeeper 协调的分布式消息系统,现已捐献给 Apache 基金会。它是一种高吞吐量的分布式发布订阅消息系统,以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、Apache Storm、Spark、Flink 等都支持与 Kafka 集成,号称一半以上世界500强都是它的客户
RocketMQ 是阿里开源的消息中间件,目前已经捐献个 Apache 基金会,它是由 Java 语言开发的,具备高吞吐量、高可用性、适合大规模分布式系统应用等特点,积极在Cloud-Native领域发力。
RabbitMQ 是采用 Erlang 语言实现的 AMQP 协议的消息中间件,最初起源于金融系统,用于在分布式系统中存储转发消息。
ActiveMQ 是 Apache 出品的、采用 Java 语言编写的完全基于 JMS1.1 规范的面向消息的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。不过由于历史原因包袱太重,目前市场份额较小,其最新架构被命名为 Apollo,号称下一代 ActiveMQ
ZeroMQ 号称史上最快的消息队列,基于 C 语言开发。ZeroMQ 是一个消息处理队列库,可在多线程、多内核和主机之间弹性伸缩,虽然大多数时候我们习惯将其归入消息队列家族之中,但是其和前面的几款有着本质的区别,ZeroMQ 本身就不是一个消息队列服务器,更像是一组底层网络通讯库
功能性 |
Kafka |
rabbitmq |
zeromq |
rocketmq |
activemq |
资料文档 |
丰富 |
丰富 |
少 |
少 |
较多 |
开发语言 |
Scala |
Erlang |
c |
java |
java |
协议支持 |
私有(TCP) |
AMQP |
TCP、UDP |
私有 |
OpenWire、STOMP、REST、XMPP、AMQP |
存储 |
内存、磁盘、数据库,支持大量堆积 |
内存、磁盘。支持少量堆积 |
消息发送端的内存或者磁盘中。不支持持久化 |
磁盘。支持大量堆积 |
内存、磁盘、数据库。支持少量堆积 |
事务支持 |
支持 |
支持 |
不支持 |
支持
|
支持
|
负载均衡 |
支持(分区单位) |
支持不好 |
去中心化,不支持负载均衡 |
支持 |
支持 |
集群 |
Leader-Slave’无状态集群 |
简单集群,“主-备“ |
不支持集群 |
多对‘Master-Slave’ 模式,开源版本不支持自动 |
简单集群,“主-备“ |
管理界面 |
一般 |
好 |
无 |
无 |
一般 |
可用性 |
非常高(分布式) |
高(主-从) |
高 |
非常高(分布式) |
高(主-从) |
消息语义 |
at least once、at most once |
at least once、at most once |
重传机制 |
at least once |
at least once |
TPS |
极大 |
比较大 |
极大 |
大 |
比较大 |
订阅方式 |
Topic为单位的订阅/发布 |
direct, topic ,Headers和fanout |
p2p |
topic/messageTag正则匹配 |
点对点(p2p)、广播(发布-订阅) |
顺序消息 |
支持 |
不支持 |
不支持 |
支持 |
不支持 |
消息确认 |
支持 |
支持 |
支持 |
支持 |
支持 |
消息回溯 |
支持按分区offset |
不支持 |
不支持 |
支持按时间点 |
不支持 |
并发度 |
高(分区数量+消费者数量) |
极高,Erlang语言 |
高 |
高 |
高 |
容灾 |
不支持,单独组件 |
不支持 |
不支持 |
不支持 |
不支持 |
加密 |
TLS/SSL、SASL身份认证和权限控制 |
TLS/SSL |
不确认 |
TLS/SSL |
TLS/SSL |
死信队列 |
不支持,业务通过connect实现 |
不支持 |
不支持 |
不支持 |
不支持 |
小型化 |
默认最少三台 |
不确认 |
不确认
|
不确认
|
不确认
|
流控 |
客户端、用户二种方式流控 |
内存、磁盘、积压三个维度进行流控 |
不支持 |
消费延时流控 |
生产者流控未落盘的数据量,默认1M 消费者未确认的消息数量 |
降级 |
无 |
无 |
无 |
无 |
无 |
调用链 |
不支持 |
不支持 |
不支持 |
不支持(商业版支持) |
不确认 |