繁体   English   中英

如何防止 SQS 多次触发 lambda

[英]How to prevent lambda triggered multiple times by SQS

我有一个由 SQS 触发的 lambda 函数,但即使操作成功,SQS 似乎也多次触发了它。 这是我的一些代码

// handle.ts to handle sqs
exports.handler = async function (event, context, callback) {
  
  // SQS may invoke with multiple messages
  for (const message of event.Records) {
    
    // make the call to a service 
    runAsyncService(message.body)
  }


  // ran all async call all together
  return callback(null, "succeed")
};

使用这些处理程序,似乎请求被触发了 3 次(可配置,但它达到了最大重试次数),每次都有不同的 RequestId(有人说,它表明请求已超时)。 然后我有这段代码可以解决多个触发器的问题。

// new handle.ts to handle sqs event
exports.handler = async function (event, context, callback) {

  let jobs: any = [] // hold all async call

  // SQS may invoke with multiple messages
  for (const message of event.Records) {
    
    // make the call to a service 
    jobs.push(runAsyncService(message.body))
  }

  // ran all async call all together
  return Promise.all(jobs)
    .then(() => {
      console.log(`All ${jobs.length} job(s) finished`)
      return context.succeed('Finished')
    })
};

如您所见,我使用Promise.all()函数来运行所有异步调用,然后调用context.succeed() ,使用它会产生副作用,如果有来自 sqs 的多个记录,如果任何一个任务是失败了,即使另一个成功了,所有的承诺也会失败。 在循环内调用context.succeed()也不是一个选项,因为它也多次触发了调用。 我现在想到的唯一选择是将批量大小限制为 1,但我不太喜欢这个想法。 我还使用getlift/lift一起配置 sqs 和 lambda。 你们对我有什么建议吗? 谢谢。

到目前为止,我的工作解决方案是将批量大小设置为 1,但这不是解决方案,它只是一种解决方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM