【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka

发布于:2025-03-28 ⋅ 阅读:(22) ⋅ 点赞:(0)

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