SQS 一遍又一遍地触发 Lambda 函数,为什么?

SQS triggers Lambda function over and over again, why?

我的 SQS 应该触发一次 Lambda 函数。好像反复触发,找不到原因

系统的工作原理如下:

  1. 文件已上传到 S3 存储桶(我们称之为 uploaded-docs)。

  2. 将文件上传到 uploaded-docs/input/ 会触发存储桶上的事件,称为 FileUploaded

  3. 事件 FileUploaded 触发一个名为 ProcessUploadedFile.

  4. 的 Lambda 函数
  5. ProcessUploadeFile 调用 Textract 来分析文档。上述 Textract 过程的输出被发布(完成后)到名为 TextractComplete.

  6. 的 SNS 主题
  7. TextractComplete 有一个订阅,SQS 名为 TextractOutputQueue.

  8. TextractOutputQueue 触发名为 GetOutput 的 Lambda 函数。每个上传的文件只应该 运行 一次

我注意到上传文件时,GetOutput 会在文件上反复调用 Task timed out after 3 seconds(通过 boto3 调用 Textract 的 GetDocumentTextDetection 命令) 可以在日志中找到,直到最终超过。

我还注意到,当上传新文件时,存储桶中的所有文件在此过程中都会被再次调用

一些假设:

  1. SQS 队列项未 "consumed",因此它们在调用各自的 Lambda 函数后仍然存在于队列中,并且因为它们仍然存在,所以它们继续调用该函数.

  2. Lambda GetOutput 陷入了某种重试循环,每次超时,它都会再次调用整个函数。这并不能解释为什么在我上传另一个文档之前日志会死掉,并且所有以前上传的文档都会以某种方式再次进入循环。

感谢所有评论,这是一个非常简单的修复。只需将 GetOutput 的超时增加到 10 秒,问题就停止了。