*Redis XCLAIM 命令

XCLAIM 用于改变(或获取)消费者组中某条消息的所有权,将消息重新分配给指定的消费者。


*语法

XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms] [TIME unix-time-milliseconds] [RETRYCOUNT count] [FORCE] [JUSTID] [LASTID id]

*参数说明

参数 类型 必填 说明
key String Stream 键名
group String 消费者组名称
consumer String 目标消费者名称
min-idle-time String 最小空闲时间(毫秒),消息空闲时间必须大于此值才能被认领
id String 消息 ID,支持多个
IDLE Integer 设置消息的空闲时间(毫秒)
TIME Integer 设置消息的空闲时间为指定的 Unix 时间戳(毫秒)
RETRYCOUNT Integer 设置消息的重试计数
FORCE Flag 强制认领,即使消息不在 PEL 中
JUSTID Flag 仅返回消息 ID,不返回内容
LASTID String 设置消费者组的最后投递 ID

*返回值

  • Array:认领成功的消息数组,每个元素包含 ID 和字段-值对
  • Array(JUSTID):仅返回认领成功的消息 ID 数组
  • Empty Array:没有消息被认领

*时间复杂度

O(log N),N 为消费者组 PEL 中的消息数量。


*示例

*基本用法

> XCLAIM mystream mygroup consumer2 60000 1526569495631-0
1) 1) "1526569495631-0"
   2) 1) "field1"
      2) "value1"

*使用 JUSTID 仅返回 ID

> XCLAIM mystream mygroup consumer2 60000 1526569495631-0 JUSTID
1) "1526569495631-0"

*强制认领并使用 RETRYCOUNT

> XCLAIM mystream mygroup consumer2 60000 1526569495631-0 FORCE RETRYCOUNT 3
1) 1) "1526569495631-0"
   2) 1) "field1"
      2) "value1"

*常见错误

错误 原因 解决
ERR wrong number of arguments 缺少必传参数 检查 key、group、consumer、min-idle-time 和 id
NOGROUP No such consumer group 消费者组不存在 先创建消费者组

*最佳实践

  • 用于处理消费者崩溃后的消息转移,min-idle-time 应大于消息处理超时时间
  • 配合 XPENDING 查找空闲时间过长的消息,然后进行 XCLAIM
  • 使用 RETRYCOUNT 跟踪消息重试次数,超过阈值可告警或放入死信队列
  • 使用 FORCE 需谨慎,可能将已被其他消费者处理的消息强制转移

*FAQ

Q1: XCLAIM 和 XACK 有什么区别? A: XACK 是确认消息已处理完毕,从 PEL 中移除;XCLAIM 是转移消息所有权,消息仍在 PEL 中。

Q2: min-idle-time 设置多少合适? A: 建议设置为业务处理超时时间的 2 倍以上,避免误将正在处理的消息转移。

Q3: 为什么 XCLAIM 返回空数组? A: 可能原因:消息空闲时间不足、消息已被 XACK、消息 ID 不存在、或其他消费者已重新认领。