当前位置:首页 > 文章列表 > 数据库 > Redis > XPENDING 怎样找出长期未确认消息

XPENDING 怎样找出长期未确认消息

来源:17golang原创 2026-10-25 11:07:27 0浏览 收藏

在 Redis Streams 消费者组里,想找出“长期未确认”的消息,先不要直接扫描原始 Stream,而是查看消费者组的 Pending Entries List(PEL)。XPENDING 可以先给出 pending 总量和消费者分布,再用明细查询或 IDLE 毫秒过滤定位具体消息。

官方地址:https://redis.io/docs/latest/commands/xpending/

XPENDING key group 适合看全局概况;XPENDING key group - + count 适合看明细;再加上 IDLE min-idle-time,就能筛出至少空闲指定毫秒数的待确认消息。它负责观察,不负责自动认领或确认。

先看 pending 消息从哪里来

一条消息被消费者组通过 XREADGROUP 读到后,如果应用还没有执行 XACK,Redis 会在该组的 PEL 中记录它。PEL 记录了消息 ID 和当前消费者,所以“pending 数量变大”只说明有消息还没有确认,并不等于某个消费者一定已经宕机。

# 用 > 读取消费者组中的新消息;读到的消息会进入该组的 PEL
redis-cli XREADGROUP GROUP orders worker-a COUNT 10 STREAMS orders-stream >

# 处理成功后确认消息;确认会把对应 ID 从 PEL 中移除
redis-cli XACK orders-stream orders 1710000000000-0

# 只观察待确认集合,不改变消息的确认状态
redis-cli XPENDING orders-stream orders
Redis Streams 中 Stream、消费者组、PEL、消费者、XPENDING 与 XACK 的静态关系说明图
图1:Redis Streams 待确认集合结构说明图,展示 XPENDING 观察的对象与 XACK 的确认边界;这是静态说明图,不是截图或运行证据。

这里要分清两个边界:XREADGROUP 负责把消息交给消费者,XPENDING 负责读取 PEL 的状态,XACK 负责完成确认。只有在这条关系上建立正确预期,后面的“长期未确认”筛选才不会被误读成重试命令。

用摘要判断是否需要继续下钻

最短的查询只有 key 和 group:

# 先看该消费者组的 pending 总量、最小 ID、最大 ID 和消费者分布
redis-cli XPENDING orders-stream orders

摘要返回的信息可以回答三个问题:当前有多少条待确认消息、它们覆盖的 ID 范围是什么、哪些消费者名下有 pending。总量为零时,不需要继续按 IDLE 查;总量很大或某个消费者分布异常时,再进入明细查询。

摘要只告诉你“有多少”和“由谁持有”,不会告诉你每一条消息具体空闲了多久。不要把最小 ID 当成最早未确认时间,也不要仅凭消费者名判断它已经失联;这两个结论都需要明细字段支持。

用明细读取空闲时间和投递次数

明细形式需要提供起始 ID、结束 ID 和数量。使用 - 与 + 可以覆盖当前 PEL 的 ID 范围:

# 返回最多 20 条明细:消息 ID、消费者、空闲毫秒数、投递次数
redis-cli XPENDING orders-stream orders - + 20

# 只看 worker-a 名下的前 20 条 pending,减少无关结果
redis-cli XPENDING orders-stream orders - + 20 worker-a

# 继续向后遍历时,把上一次最后读到的 ID 放在左括号后;这里排除该 ID
redis-cli XPENDING orders-stream orders \"(1710000000000-0\" + 20

每条明细通常包含四个值:消息 ID、当前消费者、距离上次投递经过的毫秒数,以及投递次数。空闲时间回答“多久没有再次投递”,投递次数回答“这条消息被交付过几次”;两者一起看,比只看 pending 数量更接近故障现场。

字段用途不要误读成
message ID定位 Stream 中的消息处理完成时间
consumer查看当前归属消费者一定在线
idle time按毫秒判断长期未活跃业务处理耗时
delivery count识别重复投递或认领历史失败次数的严格等价物

用 IDLE 筛出长期未确认消息

当目标是找出至少一分钟没有再次投递的消息,可以把 IDLE 放在范围参数前面。时间单位是毫秒:

# 过滤整个消费者组中空闲至少 60000 毫秒的 pending,最多返回 20 条
redis-cli XPENDING orders-stream orders IDLE 60000 - + 20

# 只筛选 worker-a 名下空闲至少一分钟的消息
redis-cli XPENDING orders-stream orders IDLE 60000 - + 20 worker-a

这个查询适合做值班排查或定时观察:先用摘要判断规模,再用一个较小的 count 分页读取。IDLE 过滤的是 PEL 中的空闲时间,不是 Stream entry 的创建时间;如果消息被重新投递,空闲时间会按 Redis 的投递记录变化。

XPENDING 的摘要、范围、IDLE 毫秒、消费者、空闲时间、投递次数与 XCLAIM 恢复边界静态结构图
图2:XPENDING 长期未确认筛选结构图,区分 IDLE 毫秒、消费者和投递次数等观察字段与 XCLAIM/XAUTOCLAIM 的恢复边界;这是静态结构图,不是运行结果。

Redis 6.2.0 起支持 IDLE 过滤和排他范围。需要遍历较大的 PEL 时,按上一次返回的最后一个 ID 使用 (last-id 作为下一页的起点,避免重复读取边界消息;每次只取固定数量,也更容易控制单次查询成本。

定位之后再决定是否恢复

XPENDING 只提供观察信息。发现某个消费者名下有很久未活跃的消息后,还要结合业务确认:消费者是否只是处理慢、消息是否允许重复处理、当前消费者是否仍可能恢复。确认需要改变消息状态时,再考虑 XACK、XCLAIM 或 XAUTOCLAIM;不要把查询结果直接当成可以认领的授权。

现象优先动作判断边界
pending 总量为零检查生产与消费是否正常不是“没有消息”的唯一证明
某消费者 pending 很多查询该消费者的明细先确认它是否仍在工作
IDLE 很大且投递次数较高评估恢复或人工介入先确认业务是否幂等
消息需要重新分配选择 XCLAIM 或 XAUTOCLAIM这已经超出 XPENDING 的观察职责

相关问题

XPENDING 能直接找出已经丢失的消息吗?

不能。它查看的是消费者组的 PEL,也就是已经投递但尚未确认的消息。要查 Stream 中的原始记录,还要根据消息 ID 配合其他 Stream 命令读取。

IDLE 60000 表示消息创建了一分钟吗?

不是。它表示消息在 PEL 中距离上次投递至少经过 60000 毫秒。创建时间和投递空闲时间是两个不同维度。

找到长期 pending 后是否应该马上 XACK?

不应该。XACK 会移除待确认记录,只有业务已经完成处理或明确决定放弃时才适用。需要转交给其他消费者时,应根据幂等性和恢复策略评估 XCLAIM 或 XAUTOCLAIM。

总结

排查长期未确认消息可以按三层推进:先用 XPENDING key group 看总量和消费者,再用范围明细读取消息 ID、消费者、空闲毫秒数和投递次数,最后用 IDLE 过滤出真正需要关注的条目。记住 XPENDING 只负责定位,确认和重新分配是后续动作,这样既能找到卡住的消息,也不容易因为一次查询误改变消费状态。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
XACK 怎样清理待处理消息XACK 怎样清理待处理消息
上一篇
XACK 怎样清理待处理消息
XCLAIM 怎样接管失联消费者消息
下一篇
XCLAIM 怎样接管失联消费者消息
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    684次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    699次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    749次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    714次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    551次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码