- 用法
-
XPENDING key group [ [ IDLE min-idle-time ] start end count [ consumer ] ]
- 复杂度
- O(N),其中 N 为返回的元素数量,因此每次调用请求少量固定数量的条目是 O(1)。O(M),其中 M 为使用 IDLE 过滤器时扫描的条目总数。当命令只返回摘要且消费者列表很小时,其运行时间为 O(1);否则,遍历每个消费者需要额外 O(N) 的时间。
- 起始版本
- 5.0.0
- ACL 类别
- @stream, @read, @slow
- 消息的 ID。
- 获取了消息但尚未确认的消费者名称。我们称之为消息的当前所有者(owner)。
- 自此消息上次传递给该消费者以来经过的毫秒数。
- 此消息被传递的次数。
- 数组回复:根据
XPENDING
的调用方式,数据会有所不同,具体说明请参见本页。
通过消费者组从流中获取数据,且不确认(acknowledge)这些数据,会产生待处理条目(pending entries)。这在 XREADGROUP
命令中已有详细解释,在我们的流简介中更是有详尽说明。XACK
命令会立即将待处理条目从待处理条目列表(Pending Entries List, PEL)中移除,因为一旦消息成功处理,消费者组就不再需要跟踪它并记住消息的当前所有者。
XPENDING
命令是检查待处理消息列表的接口,因此它是观察和理解流消费者组正在发生什么的重要命令:例如哪些客户端处于活动状态,哪些消息待消费,或者是否存在空闲消息。此外,此命令与 XCLAIM
命令一起用于实现对长时间失败的消费者进行恢复,以解决某些消息未被处理的问题:不同的消费者可以认领(claim)该消息并继续处理。这在流简介和 XCLAIM
命令页面中有更详细的解释,此处不再赘述。
XPENDING 的摘要形式
当 XPENDING
仅使用键名和消费者组名调用时,它只输出给定消费者组中待处理消息的摘要。在以下示例中,我们创建一个消费者组,并通过使用 XREADGROUP
从该组中读取立即创建一个待处理消息。
> XGROUP CREATE mystream group55 0-0
OK
> XREADGROUP GROUP group55 consumer-123 COUNT 1 STREAMS mystream >
1) 1) "mystream"
2) 1) 1) 1526984818136-0
2) 1) "duration"
2) "1532"
3) "event-id"
4) "5"
5) "user-id"
6) "7782813"
我们预计消费者组 group55
的待处理条目列表现在会有一条消息:名为 consumer-123
的消费者已获取该消息但未确认其处理。简单的 XPENDING
形式将提供此信息
> XPENDING mystream group55
1) (integer) 1
2) 1526984818136-0
3) 1526984818136-0
4) 1) 1) "consumer-123"
2) "1"
在这种形式下,该命令输出此消费者组中待处理消息的总数(本例中为一条),然后是待处理消息中最小和最大的 ID,接着列出消费者组中每个至少有一条待处理消息的消费者,以及其拥有的待处理消息数量。
XPENDING 的扩展形式
摘要提供了很好的概述,但有时我们对细节更感兴趣。为了查看所有待处理消息以及更多相关信息,我们还需要传递一个 ID 范围,这与我们使用 XRANGE
的方式类似,以及一个非可选的 count 参数,以限制每次调用返回的消息数量
> XPENDING mystream group55 - + 10
1) 1) 1526984818136-0
2) "consumer-123"
3) (integer) 196415
4) (integer) 1
在扩展形式中,我们不再看到摘要信息,而是待处理条目列表中每条消息的详细信息。对于每条消息,会返回四个属性
传递计数器,即数组中的第四个元素,当其他消费者使用 XCLAIM
认领(claims)该消息时,或当通过 XREADGROUP
再次传递消息时,或者访问消费者组中某个消费者的历史记录时(更多信息请参阅 XREADGROUP
页面),该计数器会增加。
可以向命令传递一个额外的参数,以查看具有特定所有者的消息
> XPENDING mystream group55 - + 10 consumer-123
但在上述情况下,输出会相同,因为我们只有针对单个消费者的待处理消息。然而,重要的是要记住,即使有许多来自许多消费者的待处理消息,按特定消费者过滤此操作也不会低效:我们有一个全局的待处理条目列表数据结构,以及每个消费者的待处理条目列表数据结构,因此我们可以非常高效地只显示单个消费者待处理的消息。
空闲时间过滤器
还可以根据待处理流条目的空闲时间(以毫秒为单位)进行过滤(这对于 XCLAIM
那些长时间未被处理的条目很有用)
> XPENDING mystream group55 IDLE 9000 - + 10
> XPENDING mystream group55 IDLE 9000 - + 10 consumer-123
第一种情况将返回整个组中空闲时间超过 9 秒的前 10 个(或更少)PEL 条目,而第二种情况只返回 consumer-123
的条目。
排他范围和遍历 PEL
XPENDING
命令允许像 XRANGE
和 XREVRANGE
允许遍历流条目一样,遍历待处理条目。您可以通过在上次读取的待处理条目的 ID 前加上表示开放(排他)范围的 (
字符,并将其提供给命令的后续调用来实现。
RESP2/RESP3 回复
历史
版本 | 变更 |
---|---|
6.2.0 | 添加了 |