处理死信队列中的数据

时间:2017-06-14 18:08:11

标签: amazon-web-services aws-lambda amazon-sqs

我有以下管道来移动事件: -

服务 - > SNS - > AWS Lambda - > Dynamo Db。

因此,基本上,Service正在向SNS主题发布数据,该主题由AWS Lambda Function订阅。然后,此AWS Lambda函数将数据推送到Dynamo Db。现在,我正在使用AWS Lambda添加DLQ来存储错误处理的消息。

错误消息可能是由于发布者应用程序或使用者应用程序中的错误引起的。例如。 Publisher更改了正在发布的数据的格式,并说我在AWS Lambda中不支持它,并且它给出了一些错误。

我想知道在向DLQ推送此类消息之后,我们通常做什么?

  1. 我们是否会再次尝试通过更改AWS Lambda函数来推送数据?这个步骤是手动完成还是我们定期将数据从DLQ推送到lambda函数?
  2. 我们通常只是在DLQ上发出警报,然后手动处理它?<​​/ li>
  3. 因为有时候,问题可能是由于第一次使用Dynamo Db连接,如果我们推送,这将在下次处理。如果我们手动完成,那么这将是一个问题。

3 个答案:

答案 0 :(得分:0)

AWS Lambda Dead Letter Queues将无法处理的事件定向到您为Lambda函数配置的Amazon SNS主题或Amazon SQS队列。

因此,使用订阅了SNS主题的服务或从SQS读取消息来处理错误并使用给定的有效负载由开发人员决定。解决列出的问题,

  1. 您可以使用订阅SNS主题的其他Lambda函数来处理该消息。
  2. 是的,它更类似于设置闹钟并手动处理它。
  3. 默认情况下,异步调用的失败Lambda函数将重试两次,然后除非存在DLQ设置,否则将丢弃该事件。因此,如果它是一个dynamodb连接问题,可能在第二次调用时解决了。

答案 1 :(得分:0)

答案 2 :(得分:0)

我可以在这里评论SQS-> DLQ 不需要移动消息,因为它将带来许多其他挑战,例如重复消息,恢复方案,丢失的消息,重复数据删除检查等。

这是我们实施的解决方案-

通常,我们将DLQ用于暂时性错误,而不是永久性错误。因此采取了以下方法-

  1. 像常规队列一样从DLQ中读取消息

    好处
    • 为避免重复的消息处理
    • 更好地控制DLQ-就像我进行检查一样,仅在常规队列已完全处理时才进行处理。
    • 根据DLQ上的消息扩大流程
  2. 然后遵循常规队列遵循的相同代码。

  3. 在中止作业或进程在处理过程中终止时(例如,实例被杀死或进程终止)更可靠

    好处
    • 代码可重用性
    • 错误处理
    • 恢复和消息重播
  4. 扩展了消息的可见性,因此没有其他线程可以处理它们。

    好处
    • 避免通过多个线程处理同一条记录。
  5. 仅在出现永久错误或成功时删除消息。

    好处
    • 继续处理,直到遇到暂时性错误。