XNACK

将已认领的消息释放回组的 PEL,而不确认它们,使它们可以重新传送。

语法

XNACK key group IDS numids id [id ...] [RETRYCOUNT count] [FORCE]

引入版本:8.8.0

复杂度摘要:O(1)

在流消费者组的上下文中,此命令允许消费者将挂起的消息显式释放回组的挂起条目列表 (PEL),而不需要确认它们。已发布的消息可立即重新传递给组中的其他使用者,从而消除了消息恢复通常所需的空闲超时延迟。

这在消费者正常关闭、消费者端故障、资源限制或有害消息检测等场景中特别有用。该命令提供了三种不同的模式来控制传递计数器的调整方式,从而使消费者能够对重试语义进行细粒度控制。

必需参数

key

流的名称。

group

消费组名称。

mode

控制发货计数器的调整。必须是以下之一:

  • SILENT:将交付计数器减 1,本质上是“撤消”交付增量。将此用于处理消息时消费者端的内部故障或正常关闭(其中传递“不计数”)。
  • FAIL:保持当前传送计数器值不变。当当前消费者无法处理此消息时(例如,由于内存限制),请使用此选项。根本原因可能是消息或消费者(尚不清楚),因此最好的策略是让另一个消费者尝试处理该消息。
  • FATAL:将传递计数器设置为最大值(LLONG_MAX 或~9.22 X 1018),将消息标记为永久失败。将此用于无效或可疑的恶意消息。
ids

指定要释放的消息 ID 的参数块,其中 numids 是后面的消息 ID 的数量,id [id ...] 表示要释放回组的流条目 ID。

可选参数

RETRYCOUNT

直接将传送计数器设置为指定值,覆盖基于模式的调整。无论选择哪种模式,这都可以对重试计数器进行明确的控制。注意:这是一个内部参数,消费者通常不应使用。

FORCE

为不在组 PEL 中的 ID 创建新的无主 PEL 条目。每个条目必须存在于流中。当 FORCE 创建条目时,传送计数器设置为 0(如果指定,则设置为 RETRYCOUNT,如果模式为 FATAL,则设置为 LLONG_MAX)。注意:这是一个内部参数,消费者通常不应使用。

示例

FAIL模式的基本用法
> XADD mystream * field value1
"1526569498055-0"
> XADD mystream * field value2
"1526569498056-0"
> XGROUP CREATE mystream mygroup 0
OK
> XREADGROUP GROUP mygroup consumer1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) "1526569498055-0"
         2) 1) "field"
            2) "value1"
      2) 1) "1526569498056-0"
         2) 1) "field"
            2) "value2"
> XNACK mystream mygroup FAIL IDS 2 1526569498055-0 1526569498056-0
(integer) 2

NACK 后,XPENDING 中出现消息,消费者为空:

> XPENDING mystream mygroup - + 10
1) 1) "1526569498055-0"
   2) ""
   3) (integer) -1
   4) (integer) 1
2) 1) "1526569498056-0"
   2) ""
   3) (integer) -1
   4) (integer) 1
使用SILENT模式优雅关机
> XNACK mystream mygroup SILENT IDS 1 1526569498055-0
(integer) 1

在 SILENT 模式下,传递计数器递减,有效地“撤消”传递。

对有害消息使用 FATAL 模式
> XNACK mystream mygroup FATAL IDS 1 1526569498055-0
(integer) 1

通过将传递计数器设置为最大值,将消息标记为永久失败。

详细说明

当XNACK执行成功时,条目:

  • 被标记为无主(其最后一个消费者被设置为空字符串)。
  • 分配最后传递时间0。
  • 被放置在 PEL 的 NACKed 部分的末尾。
  • 可通过 XREADGROUP CLAIM、XCLAIM 或 XAUTOCLAIM 立即重新交付。

PEL 的头部保留用于所有 NACK 消息,按 FIFO 列表排序,后面是按现有顺序既未 ACK 也未 NACK 的待处理消息。

NACK 消息的优先级高于组 PEL 中的其他待处理消息,确保它们在声明操作期间先于空闲消息传送。

笔记:

  • XNACK只会处理消费者组PEL中存在的消息ID。未挂起的消息将被忽略,并且不计入返回值中。
  • 已发布的消息占用 PEL 头部的专用区域(称为 PEL 的 XNACK 部分),确保它们比其他待处理条目优先重新传送。
  • 已发布的消息的传递时间设置为 0,无论声明命令中的 min-idle-time 参数如何,都可以立即声明它们。
  • 与 XACK 不同,此命令不会从 PEL 中删除消息,而是使它们可供其他使用者使用。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
❌ 标准
❌主动-主动
❌ 标准
❌主动-主动

返回值

RESP2

整数回复:成功释放回组PEL的消息数。不在消费者组PEL中的消息将不被统计。

RESP3

整数回复:成功释放回消费者组PEL的消息数量。不在消费者组PEL中的消息将不被统计。

参见

  • XREADGROUP:从消费者组读取消息
  • XACK:确认已处理的消息
  • XCLAIM:从其他消费者那里领取待处理的消息
  • XAUTOCLAIM:自动申领空闲待处理消息
  • XPENDING:检查消费者组中的待处理消息

资料来源:Redis 官方 XNACK 文档;中文内容参考 Redis 文档许可。