最新个人总结版:
最近笔记都不在博客上,排名下降这么快,是时候发点干货了:
RabbitMQ | Kafka | RocketMQ | |
语言 | Erlang | Scala | Java |
开发者 | Spring | Apache | Ali |
单机吞吐量 | 万 | 十万 | 十万 |
功能 | 丰富 | 简单 | 丰富 |
场景 | 订单支付超时,关闭订单; Spring Cloud Bus | Apache Druid、Spring Cloud Bus | 订单支付、取消、秒杀 |
持久化 | Erlang自己的数据库 | 文件 | 文件 |
管理界面 | 官方有 | 官方没有 | 官方有 |
文档和示例 | 文档丰富 | 文档丰富 | 示例丰富 |
集群搭建 | HAProxy或者LVS,加上KeepAlived | Zookeeper | NameServer |
事务 | 发送消息有事务模式、确认模式。XA。消息都发送成功或失败。消息都发送成功,才能被消费者消费。 | XA。消息都发送成功或失败。消息都发送成功,才能被消费者消费。 | 事务消息 |
发送消息 | 字节数组、交换机、路由键 | Key、Value、Topic、Partition、TimeStamp | 字节数组、Topic |
消费方式 | 支持Pull、Push | 只支持Pull | 支持Pull、Push |
消费消息 | 队列 | Topic、正则 | Topic、通配符表达式、多个Tag |
特色 | 虚拟主机;交换机:直连交换机、主题交换机、广播交换机,默认交换机,备份交换机,死信交换机、延时交换机 | Partition | 事务消息、顺序消息、延时消息、单向消息、写队列、读队列 |
组 | 消费者组(模式:轮询、指定、粘滞) | 消费者组(模式:集群、广播)、生产者组 | |
Topic | Topic交换机 | Topic里是Partition。Partition里是Segment。一个Segment对应3个文件。 | Topic可以设置写队列数量、读队列数量。所有Topic对应commitlog。 |
权限粒度 | 虚拟主机 | ||
写得快 | 顺序写、批量写、压缩写 | Linux group commit | |
读得快 | 二分法、稀疏索引、顺序读、批量读、send file零拷贝 | memory map零拷贝 | |
重试 | 重回队列 | 重试Topic | |
死信 | 死信交换机 | 死信Topic | |
集群特征 | 集群分镜像队列集群和非镜像队列集群。镜像队列集群的队列同步,队列消息同步。 | Topic的Partition分主从。 | 分主从。主从连接到同一个NameServer。 |
集群读写 | 分磁盘节点、内存节点;内存节点读写数据;磁盘节点备份数据。 | 只有Partition Leader能读写。 | 主能读写。可以有一个从支持读。 |
初始Leader | 指定磁盘节点、内存节点。 | Topic第一个Partition的Leader随机,其它Partition的Leader往后推,推到头,再到另一端。保证同一个Broker,同一个Topic里的Partition Leader尽可能少。 | brokerId配置0是master,1是slave。 |
选举Leader | Zookeeper选出Broker Controller。Broker Controller用Pacific从ISR选出Partition Leader。 | NameServer用Raft选举Leader。 | |
消息清理 | 策略是删除或者压缩,默认删除。 删除或者压缩针对的都是Segment。 每5分钟扫描过期消息。默认168小时过期,过期就标记为删除,每15秒,检查并删除标记为删除的Segment。 同时,可以设置日志大小上限,超过了,就删除最老的Segment。 压缩: 消息的key、value相同,就只存一份。 | 默认存放72小时,每天4点删除过期消息。磁盘空间使用超过75%,会删除过期文件;超过85%即使未过期也可能被删除;超过90%,拒绝写入消息。 |
- Push模式:很难掌握消息推送的时机和速率,因为consumer的消费速率不同。
- Pull模式:consumer可以根据自己的状况选择拉取消息的时机和速率,缺点在于如果服务端没有可供消费的消息,将导致consumer不断轮询,浪费资源。
————————————————————————————————————
下面是以前写的,没有上面的全,可以略过。
消息队列比较-rabbitmq/kafka/rocketmq/ONS - McKay - 博客园
ActiveMQ推出时间更早,功能丰富,但吞吐量不如Kafka、RocketMQ,时效性不如RabbitMQ,可靠性不如RabbitMQ、Kafka和RocketMQ,社区活跃度低,不建议使用。
RabbitMQ | RocketMQ | Kafka | |
语言 | Erlang | Java | Scala、Java |
二次开发 | 难 | 易 | 中 |
社区活跃度 | 高 | 低 | 高 |
负责开发的公司 | Pivotal(负责Spring的公司) | 阿里 | Apache |
单机吞吐量 | 万级 | 十万级 | 十万级 |
时效性 | 微秒级 | 毫秒级 | 毫秒级 |
可用性 | 高(主从架构) | 很高(分布式架构) | 很高(分布式架构) |
功能丰富度 | 高 | 高 | 低 |
Kafka是Apache用Scala和Java开发,功能丰富度低,吞吐量高,适合大数据领域的日志采集,实时计算等。
RabbitMQ目前是Spring对应的公司负责,Erlang开发,不适合二次开发,社区活跃度高,时效性高,吞吐量不如RocektMQ和Kafka,适合中小规模的项目。
RocketMQ是阿里参考Kafka用Java开发,加入了适合阿里应用场景的优化,适合二次开发,吞吐量高,适合更大规模项目,但社区活跃度不够高,如果阿里停止维护,需一定技术实力从源码自我维护。
参考:
https://gper.club/articles/7e7e7f7ff3g58gc6
RocketMQ与Kafka对比(18项差异)_xcc的博客-CSDN博客_rocketmq和kafka区别
Kafka、RocketMQ、RabbitMQ的优劣势比较_“假装、她是个有灵魂的程序员” —— Go Big Or Go Home-CSDN博客_rocketmq和rabbitmq的区别