Node.js SQS Lambda-重试逻辑?

Node.js SQS Lambda-重试逻辑?,node.js,aws-lambda,amazon-sqs,Node.js,Aws Lambda,Amazon Sqs,将消息添加到SQS队列并将其配置为触发lambda函数(nodejs)时 触发lambda函数时-我可能希望在5分钟后再次重试同一消息,而不从队列中删除该消息。如果Lambda无法连接外部主机(例如:API),我想这样做的原因是——我喜欢在5分钟后重试,只尝试3次 如何在NodeJS中编写 例如,在Laravel中,我们可以指定最大作业尝试次数功能。使用public$trys=5尝试作业的次数 资料来源: 如何在node.js中实现类似的方式 我正在考虑将消息添加到另一个队列(以便重试)。lam

将消息添加到SQS队列并将其配置为触发lambda函数(nodejs)时

触发lambda函数时-我可能希望在5分钟后再次重试同一消息,而不从队列中删除该消息。如果Lambda无法连接外部主机(例如:API),我想这样做的原因是——我喜欢在5分钟后重试,只尝试3次

如何在NodeJS中编写

例如,在Laravel中,我们可以
指定最大作业尝试次数
功能。使用
public$trys=5尝试作业的次数

资料来源:

如何在node.js中实现类似的方式

我正在考虑将消息添加到另一个队列(以便重试)。lambda函数在5分钟后读取该队列中的所有消息,并将该消息发送回主队列,它将触发lambda函数。

相当简单(如果以异步方式执行lambda),无需进行任何编码。首先:如果您的代码将抛出错误,AWS Lambda将再重试3次以执行您的代码。在这种情况下,如果外部API不可访问,那么在AWS第三次重试时会有一个很大的变化——API将正常工作。再加上重试之间的延迟是随机的,这意味着重试之间存在延迟

如果最坏的情况发生了,并且外部API还没有启动,那么您可以利用每个lambda所具有的死信队列(dead-letter queue,DLQ)特性。这将向SQS推送一条消息,说明哪里出了问题,以便您可以采取其他措施。在这种情况下,继续努力直到成功

您可以在这里阅读更多内容:

以下是我是如何做到的

  • 创建正常队列(即时交付),第1季度
  • 创建延迟队列(延迟5分钟),第2季度
  • 创建DLQ(重试后)、DLQ1
  • (Q1/Q2)SQS触发器-->Lambda L1(如果失败,在(Q1/Q2)上删除),删除 it在第2季度)-->在DLQ故障时

    当消息在Q1到达时,如果成功从那里开始,它将触发Lambda L1。如果失败,则将其放到Q2(这是一个延迟队列)。在第2季度收到的每条消息都将延迟5分钟

    如果您的初始消息可以延迟5分钟,那么您可能不需要两个队列。一队就可以了。如果初始延迟不可接受,则需要两个队列。有两个队列的另一个原因是,对于路径中出现的新消息,您总能找到一种方法

    如果在处理Q1/Q2时出现代码故障,aws基础设施将立即重试3次,然后再将其发送到DLQ1。如果您处理代码中的错误,那么就可以让管道按照您提到的计时方式工作

    SQS延迟队列:

    SQS Lambda体系结构:

    希望能有所帮助。

    根据本博客:

    利用现有重试逻辑和死信队列。如果Lambda 函数不返回成功,消息将不会从中删除 该队列将在可见性超时过期后重新出现

    可以直接在SQS队列中配置重试和重试“超时”

    创建队列时,请设置以下属性:

    默认可见性超时将是应用程序收到消息后隐藏消息的时间。如果消息在lambda运行期间失败并引发异常,lambda将不会删除批处理中的任何消息,并且所有消息最终将重新出现在队列中

    如果只想尝试3次,则必须设置SQS重新驱动策略(也称死信队列)

    重新驱动策略将使您的队列能够在消息重新出现在队列中的次数
    N
    后将消息重定向到死信队列(DLQ),其中
    N
    是介于1和1000之间的数字

    必须了解,lambda将继续处理失败的消息(在代码中生成异常的消息),直到:

  • 处理过程中没有任何错误(lambda删除消息)
  • 邮件保留期到期(SQS删除邮件)
  • 它被发送到SQS队列重新驱动策略中的DLQ集合(SQS将消息“移动”到DLQ)
  • 您可以在代码中直接从队列中删除消息(用户删除消息)
  • 否则Lambda将不会处理此错误消息


    重要观察结果 Lambda不会处理失败的消息 基于几个实验,我运行来理解SQS集成的行为(on重试可能是不明确的)

    Lambda不会删除失败的邮件,并将继续重试。即使有Lambda DLQ设置,失败的消息也不会发送到Lambda DLQ。Lambda完全依赖于SQS队列的配置,如中所述

    推荐:

    • 在SQS队列中始终使用重新驱动策略
    异常将使整批消息失败 如前所述,如果在处理消息时代码中出现异常,则会重新尝试整批消息,部分消息是否正确处理并不重要。如果由于某种原因,下游服务出现故障,您可能会收到在DLQ中处理的消息

    推荐:

    • 手动删除已正确处理的邮件
    • 确保lambda函数可以多次处理同一消息
    Lambda并发限制和SQS副作用 博客文章“”描述了如果并发限制设置得太低,lambda可能会导致成批消息被限制,并且接收到的尝试会在未经处理的情况下递增

    推荐:

    邮报和亚马逊的建议