Node.js SQS Lambda-重试逻辑?
将消息添加到SQS队列并将其配置为触发lambda函数(nodejs)时 触发lambda函数时-我可能希望在5分钟后再次重试同一消息,而不从队列中删除该消息。如果Lambda无法连接外部主机(例如:API),我想这样做的原因是——我喜欢在5分钟后重试,只尝试3次 如何在NodeJS中编写 例如,在Laravel中,我们可以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
指定最大作业尝试次数
功能。使用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可能会导致成批消息被限制,并且接收到的尝试会在未经处理的情况下递增
推荐:
邮报和亚马逊的建议