XCLAIM
更改或获取消费者组中消息的所有权,就像该消息被传递给消费者组成员一样。
语法
XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms] [TIME unix-time-milliseconds] [RETRYCOUNT count] [FORCE] [JUSTID] [LASTID lastid]
引入版本:5.0.0
复杂度摘要:O(log N)
在流消费者组的上下文中,此命令更改待处理消息的所有权,以便新所有者是命令参数中指定的消费者。 Normally this is what happens:
- 存在具有关联消费者组的流。
- 某个消费者 A 在该消费者组的上下文中通过
XREADGROUP从流中读取消息。 - 作为副作用,在消费者组的待处理条目列表 (PEL) 中创建待处理消息条目:这意味着消息已传递给给定消费者,但尚未通过
XACK确认。 - 然后突然间,该消费者永远失败了。
- 其他消费者可以使用
XPENDING命令检查已过时相当长一段时间的待处理消息列表。为了继续处理此类消息,他们使用XCLAIM来获取消息的所有权并继续。消费者还可以使用XAUTOCLAIM命令自动扫描并声明陈旧的待处理消息。
流式传输介绍文档 中清楚地解释了这一动态。
请注意,只有当消息的空闲时间大于我们在调用 XCLAIM 时指定的最小空闲时间时,才会声明该消息。因为作为副作用,XCLAIM 还将重置空闲时间(因为这是处理消息的新尝试),因此尝试同时声明消息的两个消费者永远不会同时成功:只有一个消费者会成功声明消息。这避免了我们以简单的方式多次处理给定的消息(但在一般情况下多次处理是可能且不可避免的)。
使用 XNACK 释放回组的消息可以立即声明,因为它们的传递时间设置为 0,满足任何最小空闲时间要求。
此外,作为副作用,XCLAIM 将增加尝试传送消息的计数,除非已指定 JUSTID 选项(仅传送消息 ID,而不传送消息本身)。通过这种方式,由于某种原因而无法处理的消息(例如,因为消费者在尝试处理它们时崩溃)将开始具有更大的计数器,并且可以在系统内部检测到。
以下情况XCLAIM不会认领消息:
- 该消息不存在于组 PEL 中(即从未被任何消费者读取过)
- 消息存在于组 PEL 中,但不存在于流本身中(即消息已被读取但从未确认,然后通过修剪或通过
XDEL从流中删除)
在这两种情况下,回复将不包含该消息的相应条目(即回复数组的长度可能小于提供给 XCLAIM 的 ID 数量)。在后一种情况下,该消息也将从发现该消息的 PEL 中删除。该功能是在 Redis 7.0 中引入的。
必需参数
key
流键。
group
消费者组名称。
consumer
拥有所声明消息的消费者的名称。
min-idle-time
仅声明已空闲至少这么长时间(以毫秒为单位)的消息。
id [id ...]
一个或多个要声明的消息 ID。
可选参数
以下大部分选项主要供内部使用,将XCLAIM的效果转移到AOF文件和副本中,对普通用户不太可能有用。
IDLE ms
设置消息的空闲时间(上次发送时间)。如果未指定 IDLE,则假定 0 的空闲时间,即重置时间计数,因为该消息现在有新的所有者尝试处理它。
TIME unix-time-milliseconds
与 IDLE 相同,但将空闲时间设置为特定的 Unix 时间(以毫秒为单位),而不是相对的毫秒量。这对于重写生成 XCLAIM 命令的 AOF 文件很有用。
RETRYCOUNT count
将重试计数器设置为指定值。如果未设置,则每次再次传送消息时,XCLAIM 都会增加重试计数器。
FORCE
即使指定的 ID 尚未在分配给其他客户端的 PEL 中,也在 PEL 中创建待处理消息条目。但是,该消息必须存在于流中,否则不存在的消息的 ID 将被忽略。
JUSTID
仅返回成功领取的消息ID数组,不返回实际消息。使用此选项意味着重试计数器不会增加。
LASTID lastid
将消费者组最后传递的ID更新为给定的ID。
示例
> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
2) 1) "message"
2) "orange"
在前面的示例中,您认领 ID 为 1526569498055-0 的消息并将其分配给使用者 Alice,但前提是原始使用者和其他使用者在至少一小时内都没有确认或认领该消息。
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ✅ 标准 |
✅ 标准 |
返回值
RESP2
以下任意一项: * 数组回复:当指定 JUSTID 选项时,成功声明的消息 ID 数组。 * 数组回复:流条目数组,每个流条目包含两个元素的数组,条目ID和条目数据本身。
RESP3
以下任意一项: * 数组回复:当指定 JUSTID 选项时,成功声明的消息 ID 数组。 * 数组回复:流条目数组,每个流条目包含两个元素的数组,条目ID和条目数据本身。
资料来源:Redis 官方 XCLAIM 文档;中文内容参考 Redis 文档许可。