AWS SQS:在消费者中发生错误时移至死信队列

时间:2016-04-29 02:27:23

标签: node.js amazon-web-services amazon-sqs

我尝试过使用npm软件包,例如sqs-queue-parallel& sqs-consumer用于消耗节点

中SQS的消息

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

但截至目前,它一直按最大接收计数次数重试消息

是否可以使用其他一些npm包,只要发生错误,它应该直接移动到死信队列?

4 个答案:

答案 0 :(得分:3)

您可以配置SQS队列,以便在任意数量的失败邮件收到1到1000之后将邮件移动到死信队列。

要在收到一次失败后将消息移至Dead Letter Queue,然后修改队列的配置并将“Maximum Receives”值设置为1.这将是队列“Redrive Policy”的一部分。

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

答案 1 :(得分:2)

知道这有点晚了但是认为OP正试图要求动态政策。即:

  • 正常错误 - >按照重新启动策略重试。
  • 但是,对于某些失败,您可能知道即使您尝试了100件物品也无法恢复。在那种情况下 - >将消息直接移动到死信队列。

如果被问到什么,如何做后者。

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

不要相信那里有一个特殊的'这样做的方法。

答案 2 :(得分:0)

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

class Login:
    user = None
    password = None

    @classmethod
    def set_or_get(cls, *args):
        if args:
            cls.user, cls.password = args
            return cls
        else:
            return cls.user, cls.password

login_details_a = Login.set_or_get('a', 'b')
login_details_b = Login()

print(login_details_a.set_or_get())
>> ('a', 'b')

print(login_details_b.set_or_get())
>> ('a', 'b')

login_details_b.set_or_get('c', 'd')

print(login_details_a.set_or_get())
>> ('c', 'd')

print(login_details_b.set_or_get())
>> ('c', 'd')

CookieContainer gaCookies = new CookieContainer();
Uri target = new Uri("http://www.google.com/");    
gaCookies.Add(new Cookie("__utmc", "#########") { Domain = target.Host });

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

  1. 创建新队列
  2. 称之为死信(或其他)
  3. 设置"最大接收数"值为1(表示一次调用后 "进行(错误)"消息将从队列中删除并转到死队列。
  4. 刷新!!!!
  5. 返回源队列(原始队列)
  6. 转到配置队列
  7. 设置检索政策
  8. 将您提供给死信队列的名称
  9. 那就是它!祝你好运,我不得不说sqs是扩展任务的好方法。

答案 3 :(得分:0)

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

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

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

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