XAUTOCLAIM
XAUTOCLAIM key group consumer min-idle-time start [COUNT count] [JUSTID]
- 可用版本
- Redis 开源版 6.2.0
- 时间复杂度
- 如果 COUNT 较小,则为 O(1)。
- ACL 类别
-
@write
,@stream
,@fast
,
此命令转移符合指定条件的待处理流条目的所有权。从概念上讲,XAUTOCLAIM
等同于调用 XPENDING
然后调用 XCLAIM
,但提供了一种更直接的方式来处理消息传递失败,通过类似 SCAN
的语义。
与 XCLAIM
类似,该命令对 <key>
上的流条目并在提供的 <group>
的上下文中操作。它将待处理时间超过 <min-idle-time>
毫秒且 ID 大于或等于 <start>
的消息的所有权转移给 <consumer>
。
可选的 <count>
参数(默认为 100)是命令尝试认领的条目数量的上限。在内部,命令从 <start>
开始扫描消费者组的待处理条目列表(PEL),并过滤掉闲置时间小于或等于 <min-idle-time>
的条目。命令扫描的待处理条目数量的最大值是 <count>
值乘以 10(硬编码)的乘积。因此,认领的条目数量可能少于指定的值。
可选的 JUSTID
参数改变回复内容,只返回成功认领的消息 ID 数组,而不返回实际消息。使用此选项意味着不会增加重试计数器。
命令将认领的条目作为一个数组返回。它还返回一个流 ID,用于类似游标的用途,作为后续调用的 <start>
参数。当没有剩余的 PEL 条目时,命令返回特殊 ID 0-0
以表示完成。但是请注意,即使扫描完成并使用 0-0
作为 <start>
ID,您可能仍然希望继续调用 XAUTOCLAIM
,因为时间已经过去足够长,旧的待处理条目可能现在已符合认领条件。
请注意,只有闲置时间长于 <min-idle-time>
的消息才会被认领,并且认领消息会重置其闲置时间。这确保了在特定时刻只有一个消费者可以成功认领给定的待处理消息,并显著降低了多次处理相同消息的可能性。
在遍历 PEL 时,如果 XAUTOCLAIM
偶然发现流中不再存在的消息(已被 XDEL
裁剪或删除),它不会认领该消息,并将其从所在的 PEL 中删除。此功能在 Redis 7.0 中引入。这些消息 ID 会作为 XAUTOCLAIM
回复的一部分返回给调用者。
最后,使用 XAUTOCLAIM
认领消息也会增加该消息的尝试交付次数,除非指定了 JUSTID
选项(此选项只交付消息 ID,不交付消息本身)。由于某种原因无法处理的消息(例如,消费者在处理时系统性崩溃)将显示高尝试交付次数,这可以通过监控检测到。
示例
> XAUTOCLAIM mystream mygroup Alice 3600000 0-0 COUNT 25
1) "0-0"
2) 1) 1) "1609338752495-0"
2) 1) "field"
2) "value"
3) (empty array)
在上面的示例中,我们尝试认领最多 25 个待处理且闲置(未被确认或认领)至少一个小时的条目,从流的起始位置开始。来自“mygroup”组的消费者“Alice”获得了这些消息的所有权。请注意,示例中返回的流 ID 是 0-0
,表示整个流已被扫描。我们还可以看到,XAUTOCLAIM
没有遇到任何已删除的消息(第三个回复元素是一个空数组)。
RESP2/RESP3 回复
数组回复,具体来说,是一个包含三个元素的数组
- 一个流 ID,用作下一次调用 XAUTOCLAIM 的 start 参数。
- 一个包含所有成功认领消息的 数组回复,其格式与
XRANGE
相同。 - 一个包含流中不再存在的消息 ID 的 数组回复,这些消息 ID 已从所在的 PEL 中删除。
历史
- 从 Redis 7.0.0 版本开始:回复数组中添加了一个元素,包含命令从 PEL 中清除的已删除条目