常用消息队列对比

2020/01/02 消息中间件

常用消息队列对比

  ActiveMQ RabbitMQ Kafka RocketMQ zeroMQ
1.资料文档 网络资料多 多,比较新的书比如《RabbitMQ实战指南》 有kafka作者自己写的书,较新的书有《Kafka并不难学》 网络资料良莠不齐,官方文档比较简洁 网络只有代码实现和简单介绍
2.开发语言 java Erlang Scala java c
3.支持的协议 OpenWire、STOMP、REST、XMPP、AMQP AMQP 基于TCP 自己定义的一套 自己定义的一套 TCP、UDP
4.消息存储 内存、磁盘、数据库,支持少量堆积 内存、磁盘、支持少量堆积 内存、磁盘、数据库。支持大量堆积 磁盘,支持大量堆积(commitLog文件) 高并发写性能突出(累积4K才强制从pagecache中刷到磁盘) 消息发送端的内存或者磁盘中,不支持持久化
5.消息事务 支持 支持 支持(客户端将信道设置为事务模式) 支持 不支持
6.负载均衡 支持负载均衡,可基于zookeeper实现负载均衡 负载均衡支持不是很好 1.通过交换器和绑定机制可以决定投递的队列,这些多需要手动创建,镜像队列机制可以解决broker负载过大的问题 2.多消费者采用轮询机制,basicQos可以限制信道上的消费者能保持的最大未确认消息数量 3.可借助HAProxy、LVS技术,或者在客户端使用算法实现负载均衡 支持负载均衡(大部分是自动完成) 支持 去中心化,不支持负载均衡。本身只是一个多线程网络库
7.集群方式 支持简单集群模式,简单主备,对高级集群模式支持不好 支持简单集群,对高级集群模式支持不好(个人理解:网络是个严重问题,最好部署同一局域网),需要至少一个磁盘节点 天然的leader-slave无状态集群,每台服务器既是Master也是Slave。依靠zookeeper 常用 多对’Master-Slave’ 模式,开源版本需手动切换Slave变成Master。Broker部署相对复杂, slave会从master拉取数据备份 去中心化,不支持
8.管理界面 一般 好,自带可视化控制台,亲测操作非常完备 一般,有开源工具kafka-eagle 一搬,有控制台
9.可用性 高(主从) 高(主从) 非常高(分布式) 非常高(分布式)
10.消息重复 支持 at least once 支持 at least once ,at most once 支持 at least once ,at most once 支持 at least once 只有重传机制,没有持久化,消息丢了重传也没用
11.吞吐量 比较大 比较大 极大,按批次发送消息和消费消息 大(可以批量消费,不批量发送) 极大
12.订阅形式和消息分发 点对点、广播 direct, topic ,Headers和fanout 基于topic及按照topic进行正则匹配的发布订阅模式 基于topic/messageTag以及按照消息类型、属性进行正则匹配的发布订阅模式 点对点 p2p
13.顺序消息 不支持 不支持 支持 支持 不支持
14.消息确认 支持 支持 autoAck : false true 支持 ack : 0,1,all 支持 支持
15.消息回溯 不支持 不支持 支持指定分区okkset位置的回溯 支持指定时间点的回溯 不支持
16.消息重试 不支持 不支持,但是可以利用消息确认机制实现 不支持,但是可以实现(支持指定分区offset位置的回溯,可以实现消息重试) 支持,策略是在消费失败时定时重试,每次时间间隔相同 发送端的send方法的内部重试逻辑: a)至多重试三次 b)如果发送失败,则轮转到下一个broker c)这个方法的总耗时不超过sendMsgTimeout设置的值,默认10s,超过时间不再重试 不支持
17.并发度 极高(Erlang语言) 高(消费者中再开启多线程可进一步提高) 高(基本同kafka)

Search

    Table of Contents