【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka
1. 消息队列
几个组件:
- Redis Stream:适用于对性能要求高、可靠性要求不高的场景
- Rocket MQ:可靠性高,性能优秀,但官方对 go 不太友好,sdk 缺少很多功能支持
- Rabbit MQ:性能适中,使用较复杂,路由、绑定等操作增加了学习成本
- Kafka:适用于高吞吐量场景,配置灵活但复杂
可靠性:RocketMQ > Kafka > RabbitMQ > Redis Stream
性能:Kafka > Redis Stream > RocketMQ > RabbitMQ
水平扩展:Kafka > RocketMQ > RabbitMQ > Redis Stream
使用复杂度:Redis Stream < RabbitMQ < RocketMQ < Kafka
特性对比
生产者:
特性 | Redis Stream | Rocket MQ | Rabbit MQ | Kafka |
自动创建 topic | 支持 | 不支持,可开启rocketmq配置但官方不建议 | 不支持,需声明交换机 | 支持,需开启kafka配置 |
topic 类型 | 无 | 多种,一般使用 FIFO 顺序消息类型 | 多种,一般使用 fanout 发布订阅模式 | 无 |
指定分区 | 不支持 | 支持 | 不支持 | 支持 |
持久化 | 支持 | 支持 | 支持 | 支持 |
消息清理策略 | 生产消息时可配置 MaxLen 队列可容纳的最大长度(默认永久保留) | 通过配置文件配置消息保留最长时间(默认未消费的消息保留3天) | 初始化队列时可配置x-message-ttl 消息保留最长时间(默认未消费消息永久保留) | 通过配置文件配置消息保留最长时间(默认未消费的消息默认保留7天) |
消费者:
特性 | Redis Stream | Rocket MQ | Rabbit MQ | Kafka |
自动创建消费者组 | 支持 | 不支持,可开启rocketmq配置但官方不建议 | 不支持,需声明队列并绑定交换机 | 支持,需开启kafka配置 |
单次拉取消息的大小限制 | 可配置最大拉取个数 | 可配置maxMessageNum 最大拉取个数 | 可通过 Qos 配置最大拉取个数 | 可配置拉取的最大消息大小(字节) |
单次拉取消息的方式 | 可配置阻塞拉取/主动拉取 | 主动拉取 | 阻塞拉取 | 阻塞拉取 |
消费的起始位置(新建立订阅关系时) | 可灵活指定起始offset | 从最新开始消费 | 从最新开始消费 | 从最新开始消费 |
消费的起始位置(已存在订阅关系时) | 可灵活指定起始offset | 从上次offset开始消费 | 从上次offset开始消费 | 从上次offset开始消费 |
自动 ACK | 不支持 | 不支持 | 支持 | 支持 |
ACK 机制 | 支持 | 支持 | 支持 | 支持 |
NACK 机制 | 不支持 | 不支持 | 支持,消息会被重新分配 | 不支持 |
消费超时(超过时间未ACK/NACK) | 消息一直处于Pending状态 | 超时消息会被重新分配,可配置超时时间 invisibleDuration | 消息一直处于Pending状态 | 消息会等待rebalance后被重新分配 |
2. 延时队列
几个组件:
Redis | Rocket MQ | Rabbit MQ | Kafka | |
延时队列支持 | 不支持,但可基于 ZSET 实现 | 支持 | 支持 | 不支持 |
安装依赖 | 无 | 无 | 需安装延时队列插件 | - |
topic 类型 | 无 | DELAY 消息类型 | 交换机类型 x-delayed-message | - |
适用场景 | 可靠性要求不高、不希望引入复杂中间件 | 高可靠性和性能要求、数据量大 | 需要可靠的延时队列、消息量适中 | - |
可靠性:RocketMQ > RabbitMQ > Redis
性能:Redis > RocketMQ > RabbitMQ
延迟精度:Redis > RabbitMQ > RocketMQ