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 部分的末尾。
- 可通过
XREADGROUPCLAIM、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 文档许可。