首页/数据/数据库速查/Streams 消费者组:XREADGROUP / XACK / PEL
Redis 运维与场景124 条

Streams 消费者组:XREADGROUP / XACK / PEL

消费者组把消息分发给多个消费者:XGROUP 建组,XREADGROUP 用 > 读新消息,XACK 确认;未确认消息进入 PEL(Pending Entries List),消费者宕机后用 XAUTOCLAIM/XCLAIM 转移重试。

数据库速查数据更新于 2026-10-13

消费者组解决什么问题

Streams 的消费者组把一条消息分发给组内的多个消费者,同时记录谁在处理、处理了多久。消费者读取消息后必须用 XACK 确认,未确认的消息会留在待处理列表(PEL)里;消费者宕机后,其他消费者可以按空闲时间把消息认领回来重试。这套机制让「消费失败不丢消息」变成框架能力而不是业务自己造。

基本信息

适用平台Redis 5.0+ 的 Streams;XAUTOCLAIM 需 6.2+
建组命令XGROUP CREATE stream group id [MKSTREAM]
读取命令XREADGROUP GROUP g consumer COUNT n BLOCK ms STREAMS key >
确认命令XACK stream group id
故障转移XAUTOCLAIM(6.2+)或 XCLAIM

典型使用场景

  • 订单异步处理:多个消费者并行消费,失败可重投
  • 消息投递审计:确认哪些消息已被处理、哪些仍在挂起
  • 消费者扩容缩容:新实例加入后自动分到未处理消息
  • 延迟任务:结合空闲时间认领实现超时重试
  • 需要保留历史消息并支持回溯读取的场景

完整消费流程

完整消费流程
XGROUP CREATE orders g1 0 MKSTREAM           # 建组并从 0 开始(含历史消息)
XREADGROUP GROUP g1 consumer1 COUNT 10 BLOCK 2000 STREAMS orders >
# 处理完成后确认,未确认的消息会留在 PEL
XACK orders g1 1737100000000-0
# 查看待处理概览与明细
XPENDING orders g1
XPENDING orders g1 - + 10
# 认领空闲超过 60 秒的消息给新消费者
XAUTOCLAIM orders g1 consumer2 60000 0-0 COUNT 10
# 观察组与消费者状态
XINFO GROUPS orders
XINFO CONSUMERS orders g1

关键命令与作用

命令作用要点
XGROUP CREATE创建消费者组指定起始 ID 决定是否消费历史
XREADGROUP >读取从未投递的新消息指定 ID 则读自己 PEL 中的历史
XACK确认消息已处理不确认会被重复投递
XPENDING查看待处理消息数量和空闲时间都要看
XAUTOCLAIM按空闲时间批量认领6.2+ 提供,替代逐个 XCLAIM
XINFO CONSUMERS查看消费者状态已废弃的消费者会挂着 pending
消费逻辑必须幂等:消息可能被多次投递,业务处理要以消息 ID 或业务唯一键做去重,这样重试才安全。
PEL 只增不减通常有两个原因:消费者没有执行 XACK,或者消费者已下线但没人认领它的消息。把 XPENDING 的数量纳入监控,才能及时发现消息堆积。

易错点

  • 处理成功却忘记 XACK:消息一直挂在 PEL 中并可能被再次投递,业务必须容忍重复
  • 消费者名字复用却不清理:旧消费者的待处理消息无人认领,长期堆积且难以追踪
  • 不监控 XPENDING:消息持续挂起没有告警,业务侧表现为「任务没执行但系统看起来正常」
  • 把 Streams 的 > 当成读取全部:> 只投递从未投递过的新消息,重读历史要显式指定 ID

数据来源与参考

  • Redis 官方文档: Consumer groups
  • Redis 官方文档: XREADGROUP

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌