*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 不存在、或其他消费者已重新认领。