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 消费者未确认的消息数量 |
降级 | 无 | 无 | 无 | 无 | 无 |
调用链 | 不支持 | 不支持 | 不支持 | 不支持(商业版支持) | 不确认 |