XAUTOCLAIM
XAUTOCLAIM key group consumer min-idle-time start [COUNT count] [JUSTID]
- Available since:
- 6.2.0
- Time complexity:
- O(1) if COUNT is small.
- ACL categories:
-
@write
,@stream
,@fast
,
此命令将符合指定条件的待处理流条目的所有权转移。从概念上讲,XAUTOCLAIM
等同于调用 XPENDING
然后调用 XCLAIM
,但提供了一种更直接的方式来通过类似 SCAN
的语义处理消息传递失败。
与XCLAIM
类似,该命令在
的流条目上操作,并在提供的
的上下文中进行。
它将所有权转移给
,这些消息已经等待超过
毫秒,并且具有等于或大于
的ID。
可选的
参数,默认值为100,是命令尝试认领的条目数量的上限。
在内部,命令从
开始扫描消费者组的待处理条目列表(PEL),并过滤掉空闲时间小于或等于
的条目。
命令扫描的待处理条目的最大数量是
的值乘以10(硬编码)的乘积。
因此,认领的条目数量可能少于指定的值。
可选的 JUSTID
参数将回复更改为仅返回成功认领消息的ID数组,而不返回实际消息。
使用此选项意味着重试计数器不会增加。
该命令将声明的条目作为数组返回。它还返回一个流ID,用于类似游标的用途,作为其后续调用的
参数。
当没有剩余的PEL条目时,该命令返回特殊的0-0
ID以表示完成。
然而,请注意,即使在扫描完成后,您可能仍希望继续调用XAUTOCLAIM
,即使
ID为0-0
,因为经过足够的时间后,较旧的待处理条目现在可能符合声明条件。
请注意,只有空闲时间超过
的消息才会被认领,并且认领消息会重置其空闲时间。
这确保了在特定时间点只有一个消费者能够成功认领给定的待处理消息,从而大大减少了多次处理同一消息的可能性。
在迭代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 回复
Array reply,具体来说,是一个包含三个元素的数组:
- 一个流ID,将用作下一次调用XAUTOCLAIM时的start参数。
- 一个数组回复,包含所有成功认领的消息,格式与
XRANGE
相同。 - 一个数组回复,包含不再存在于流中的消息ID,这些消息ID已从它们所在的PEL中删除。
历史
- 从 Redis 7.0.0 版本开始:在回复数组中添加了一个元素,包含命令从 PEL 中清除的已删除条目