redis-cli XREADGROUP GROUP order_group worker-1 COUNT 100 \
  STREAMS order_stream 0
redis-cli XAUTOCLAIM order_stream order_group w1 30000 0-0

消费者重启后昨天没处理完的消息全不见了,XREADGROUP 用大于号只读新消息,旧的都躺在 pending 里。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:大于号只投递从来没有分配过的消息,历史未确认的那批必须读 0 或者用 XAUTOCLAIM 才能重新拿到手里。

「Redis Stream 未确认消息」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:启动时先用 0 读本消费者自己的 pending 列表;再用 XAUTOCLAIM 领走别的消费者超时未确认的消息;两轮都处理完 最后才开始读大于号后面的新消息。

确认没问题再收工,重启后 pending 里的历史消息被处理并 XACK,业务没有缺口。

作者 9823189