SQS 一遍又一遍地触发 Lambda 函数,为什么?
SQS triggers Lambda function over and over again, why?
我的 SQS 应该触发一次 Lambda 函数。好像反复触发,找不到原因
系统的工作原理如下:
文件已上传到 S3 存储桶(我们称之为 uploaded-docs
)。
将文件上传到 uploaded-docs/input/
会触发存储桶上的事件,称为 FileUploaded
。
事件 FileUploaded
触发一个名为 ProcessUploadedFile
.
的 Lambda 函数
ProcessUploadeFile
调用 Textract 来分析文档。上述 Textract 过程的输出被发布(完成后)到名为 TextractComplete
.
的 SNS 主题
TextractComplete
有一个订阅,SQS 名为 TextractOutputQueue
.
TextractOutputQueue
触发名为 GetOutput
的 Lambda 函数。每个上传的文件只应该 运行 一次
我注意到上传文件时,GetOutput
会在文件上反复调用 Task timed out after 3 seconds
(通过 boto3
调用 Textract 的 GetDocumentTextDetection
命令) 可以在日志中找到,直到最终超过。
我还注意到,当上传新文件时,存储桶中的所有文件在此过程中都会被再次调用。
一些假设:
SQS 队列项未 "consumed",因此它们在调用各自的 Lambda 函数后仍然存在于队列中,并且因为它们仍然存在,所以它们继续调用该函数.
Lambda GetOutput
陷入了某种重试循环,每次超时,它都会再次调用整个函数。这并不能解释为什么在我上传另一个文档之前日志会死掉,并且所有以前上传的文档都会以某种方式再次进入循环。
感谢所有评论,这是一个非常简单的修复。只需将 GetOutput
的超时增加到 10 秒,问题就停止了。
我的 SQS 应该触发一次 Lambda 函数。好像反复触发,找不到原因
系统的工作原理如下:
文件已上传到 S3 存储桶(我们称之为
uploaded-docs
)。将文件上传到
uploaded-docs/input/
会触发存储桶上的事件,称为FileUploaded
。事件
FileUploaded
触发一个名为ProcessUploadedFile
. 的 Lambda 函数
ProcessUploadeFile
调用 Textract 来分析文档。上述 Textract 过程的输出被发布(完成后)到名为TextractComplete
. 的 SNS 主题
TextractComplete
有一个订阅,SQS 名为TextractOutputQueue
.TextractOutputQueue
触发名为GetOutput
的 Lambda 函数。每个上传的文件只应该 运行 一次
我注意到上传文件时,GetOutput
会在文件上反复调用 Task timed out after 3 seconds
(通过 boto3
调用 Textract 的 GetDocumentTextDetection
命令) 可以在日志中找到,直到最终超过。
我还注意到,当上传新文件时,存储桶中的所有文件在此过程中都会被再次调用。
一些假设:
SQS 队列项未 "consumed",因此它们在调用各自的 Lambda 函数后仍然存在于队列中,并且因为它们仍然存在,所以它们继续调用该函数.
Lambda
GetOutput
陷入了某种重试循环,每次超时,它都会再次调用整个函数。这并不能解释为什么在我上传另一个文档之前日志会死掉,并且所有以前上传的文档都会以某种方式再次进入循环。
感谢所有评论,这是一个非常简单的修复。只需将 GetOutput
的超时增加到 10 秒,问题就停止了。