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:当消费者发生错误时移动到死信队列的主要内容,如果未能解决你的问题,请参考以下文章