Redis 实现消息队列

2021/01/26 posted in  实践

消息队列要能支持组件通信消息的快速读写;消息队列的的存取需求:消息保序、处理重复消息、保证消息可靠;Redis 的 List 和 Streams 都能满足需求。

基于 List 的消息队列解决方案

  1. 保证有序性 :List 本身就是按先进先出的顺序进行存取的,所以可以保证消息的有序。生产者使用 LPUSH 写入数据,消费者使用 RPOP 消费消息,但是不能及时的通知消费者消费消息。可以通过 BRPOP 命令阻塞式读取,没有消息是阻塞,有新数据写入后开始执行
  2. 保证幂等性:生产者发送消息前自身生成一个全局的ID,消费者对消息的ID和已经消费的ID保证幂等性
  3. 保证消息的可靠性:List 提供了BRPOPLPUSH命令,从一个List消费消息,同时把另一个消息发送给另一个List
  4. 但是存在消息积压的问题,Redis 内存压力大



基于 Streams 的消息队列的解决方案

Streams 是Redis 专门为消息队列设计的数据结构类型,体用了丰富的消息队列操作命令

  1. XADD : 插入消息,保证有序,可以自动生成全局唯一ID
  2. XREAD :读取消息,可以按ID读取数据
  3. XREADGROUP : 按消费组形式读取消息
  4. XPENDING 和 XACK : XPENDING查询每个消费组内所有已读取但是未确认的消息,XACK : 用于向消息队列确认消息处理完成

二者对比