XCLAIM:转移消息的归属权

用户可以通过执行XCLAIM命令,将指定消息的归属权从一个消费者转向另一个消费者,这个命令的基本格式并不复杂:

XCLAIM stream group new_consumer max_pending_time id [id id ...]

命令中的stream参数和group参数指定了消息所在的流和消费者组, new_consumer指定了消息的新消费者,而命令中的任意多个id参数则指明了需要转移归属权的消息。

除此之外,命令中毫秒格式的max_pending_time参数指定了执行归属权转移操作所需的最大消息处理时限,具体来说:

  • 如果XCLAIM命令执行的时候,消息原来的消费者用在处理该消息上的时间已经超过了指定的时限,那么归属权转移操作就会被执行。

  • 与此相反,如果原消费者处理该消息的时间并未超过给定的时限,或者该消息已经被原消费者确认,那么归属权转移操作将放弃执行。

这里的消息处理时间指的是从消费者组将消息递送给原消费者开始,直到XCLAIM命令执行为止,所用的时间总长。

举个例子,如果一个用户执行以下命令:

redis> XCLAIM cgs all-message worker2 60000 1535002039330-0
1) 1) 1535002039330-0 -- 被转移消息的ID
2) 1) "k1" -- 被转移消息的内容
2) "v1"

那么该用户的意思是,如果消息 1535002039330-0 现在的消费者处理该消息的时间超过了60000ms,那么将该消息的归属权转移给消费者 worker2。

正如上述命令调用所示,XCLAIM 命令在成功执行之后将会返回被转移的消息作为结果;相反,如果转移操作因为处理时限未到等原因而未能顺利执行,那么命令将返回一个空列表:

redis> XCLAIM cgs all-message worker2 60000 1535002039330-0
(empty list or set)

只返回被转移消息的ID

在默认情况下,XCLAIM 命令在成功执行之后会把被转移消息的ID及其内容全部返回给客户端,但如果有需要的话,用户也可以通过给定可选的JUSTID选项,让命令只返回被转移消息的ID,这样处理起来就会更直观,并且能减少不必要的带宽消耗:

XCLAIM stream group new_consumer max_pending_time id [id id ...] [JUSTID]

以下是一个使用JUSTID选项的XCLAIM命令调用示例:

redis> XCLAIM cgs all-message worker3 60000 1535002039330-0 JUSTID
  • 1535002039330-0—​只返回被转移消息的ID

其他信息

  • 复杂度:O(N),其中N为用户给定的消息ID数量。

  • 版本要求:XCLAIM命令从Redis 5.0.0版本开始可用。