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,业务没有缺口。
