15 | 消息队列的考验:Redis有哪些解决方案?

429 阅读2分钟

消息队列的消息存取需求

  • 消息队列作用:作为不同处理速度组件的缓冲区

  • 消息队列需求

    • 消息保序\

    • 重复消息处理\

    • 消息可靠性保证

\

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

  • 消息保序\

    • list天然保证
    • 写消息 lpush
    • 读消息 rpop或brpop(阻塞客户端 wait notify,不占用消费者CPU资源)
  • 重复消息处理

    • 消息队列要能给每一个消息提供全局唯一的 ID(snow flake)\

    • 消费者程序要把已经处理过的消息的 ID 号记录下来\

    • 保证消费的幂等性

  • 消息可靠性保证

    • BRPOPLPUSH 将消息再插入到另一个List 备份List
  • 可能的问题:生产者消息发送很快,而消费者处理消息的速度比较慢,这就导致 List 中的消息越积越多,给 Redis 的内存带来很大压力

  • list不支持多个消费者,可以使用Steam代替

\

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

  • Streams 是 Redis 专门为消息队列设计的数据类型(基于内存的消息队列)\

  • 操作

    • XADD:插入消息,保证有序,可以自动生成全局唯一 ID\

    • XREAD:用于读取消息,可以按 ID 读取数据(设置block的值)\

    • XREADGROUP:按消费组形式读取消息\

    • XPENDING 命令可以用来查询每个消费组内所有消费者已读取但尚未确认的消息\

    • XACK 命令用于向消息队列确认消息处理已完成

    • XGROUP创建消费组

总结

  • 内存消息队列 Redis 5.0后使用Streams

  • 消息队列需求

    • 消息保序 消息数据有序存取

    • 重复消息处理 消息数据具有全局唯一编号\

    • 消息可靠性保证 消息数据在消费完成后被删除