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 类型 |
无 |
交换机类型 x-delayed-message |
- |
|
适用场景 |
可靠性要求不高、不希望引入复杂中间件 |
高可靠性和性能要求、数据量大 |
需要可靠的延时队列、消息量适中 |
- |
可靠性:RocketMQ > RabbitMQ > Redis
性能:Redis > RocketMQ > RabbitMQ
延迟精度:Redis > RabbitMQ > RocketMQ