AWS SQS 如何重置消息的 ReceiveCount

AWS SQS How can I reset a message's ReceiveCount

出于各种原因,我在 AWS 上的消费者有时会从 SQS 队列中读取一些消息,并决定将其中一些放回队列中以供稍后处理。

我这样做的方法是将它们的 VisibilityTimeout 设置为 0,这使它们立即对其他消费者可见。这已记录在案 here

问题是,在这样做几次之后,消息的 ReceiveCount 到达 maxReceiveCount,这导致消息被移动到 DLQ。我想知道我是否可以通过某种方式重置消息的 ReceiveCount 来避免这种情况。

我目前能想到的唯一选择是将消息的副本发送回队列的开头并删除原始消息。

这完全取决于您的工作量。在您的 DLQ 上使用 lambda 将消息写回主队列以进行重试的情况并不少见。但是,您通常会稍微转换消息并添加(例如)一个密钥到 json 数据包,如 dlq_retry_count。然后,如果低于某个阈值或删除消息,您的 DLQ lambda 可以重试。

如果您只是不断地获取 DLQ 消息并将它们抽回队列而没有任何跟踪手段,您最终可能会得到一个充满毒丸消息的队列。

I'm wondering if I can somehow reset the message's ReceiveCount to avoid that.

遗憾的是,您无法重置它,因为它由 SQS 自动管理。你无法控制它。

如果您不想使用多个 SQS,一个用于不同的目的和消费者,我能想到的唯一解决方案就是简单地 增加 maxReceiveCount考虑到这些额外的阅读。因此,如果您知道您的消息将被读取并返回到队列中,比如说 5 次,然后将 maxReceiveCount 增加到 8 个实例。这意味着如果消息的阅读次数是预期的 3 倍,则说明它有问题。