AWS SQS:当消费者发生错误时移动到死信队列

Posted

技术标签:

【中文标题】AWS SQS:当消费者发生错误时移动到死信队列【英文标题】:AWS SQS: Moving to dead letter queue when error happens in consumer 【发布时间】:2016-08-24 00:53:23 【问题描述】:

我曾尝试使用 npm 包,如 sqs-queue-parallel 和 sqs-consumer 来消费节点中 SQS 的消息

但最近我有一种机制,当处理过程中特定消息发生错误时,它应该被移动到死信队列

但截至目前,它会继续按最大接收计数次数重试消息

是否可以使用其他一些 npm 包,无论何时发生错误都应该直接移动到死信队列?

【问题讨论】:

【参考方案1】:

知道这有点晚了,但认为 OP 正在尝试要求动态策略。即:

正常错误 -> 根据重新驱动策略重试。 但是,对于某些故障,您可能知道即使尝试一百次也无法恢复。在这种情况下-> 将消息直接移动到死信队列。

如果可能被问到,如何做后者。

答案可能是手动将消息复制到死信队列(在这方面它的行为与任何其他队列一样),然后从源队列中删除消息。

不要相信有一种“特殊”的方法可以做到这一点。

【讨论】:

【参考方案2】:

您可以将 SQS 队列配置为在收到 1 到 1000 条失败消息后将消息移动到死信队列。

要在仅一次接收失败后将消息移至死信队列,然后修改队列的配置并将“最大接收数”值设置为 1。这将是队列“重新驱动策略”的一部分。

请参阅以下有关配置队列的 AWS 文档: http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSDeadLetterQueue.html

【讨论】:

【参考方案3】:

您不需要使用新的 npm,因为它会在您处理完消息后自动发生。例如,如果您在完成消息时一直在使用 node-consumer:

done() //in order to remove from queue due to for success probably

done(err) //in order to keep in queue

所以现在为了将消息从队列移动到死信队列,您不需要在代码中执行任何其他操作,只需在您的 sqs 控制台管理器中执行:

    创建一个新队列 称其为死消息(或其他) 将“最大接收次数”值设置为 1(这意味着在一次调用 “完成(错误)”消息将从您的队列中删除并进入死队列。 刷新!!!!!! 回到您的源队列(原始队列) 去配置队列 设置检索策略 把你给死信队列的名字放进去

就是这样!祝你好运,我不得不说 sqs 是扩展任务的好方法。

【讨论】:

【参考方案4】:

我认为 OP 是在询问是否有办法在处理消息的“单一失败”之后将消息移动到 DLQ。根据这 2 个 SQS 文档,我看到了以下 2 点:

    如果源队列有一个将 maxReceiveCount 设置为 5 的重新驱动策略,并且源队列的使用者收到 6 次消息而从未删除它,Amazon SQS 会将消息移动到死信队列 (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) . 最大接收值必须在 1 到 100 之间 (https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html)

这意味着即使您将最大接收值设置为 1,您的消费者仍会收到“至少两次”消息

我找不到任何解决方案,您可以在一次失败后将失败的消息移动到 DLQ。很想听听其他人对此的看法

【讨论】:

以上是关于AWS SQS:当消费者发生错误时移动到死信队列的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 死信队列

当 DLQ 尚不存在时,如何通过 Terraform 配置 SQS?

从 AWS Lambda 读取 SQS 队列

RabbitMQ实战-死信队列

AWS SQS Boto3 手动将消息发送到死信

正确计算发送到死信 SQS 队列的消息数