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