使用 AWS Gateway - Lambda - RDS 的长 运行 作业

Long running jobs with AWS Gateway - Lambda - RDS

我的架构是 AWS 网关 - Lambda - RDS 我已经从客户那里获取数据作为 xlsx 文件。

我有 2 个步骤

1.Process 文件并存储到事务表中。

2.After 用户批准将数据处理到活动表。

我的问题是针对大文件,由于时间限制(AWS 网关 30 秒,Lambda 15 分钟)和同步过程, 我无法完成流程。 请建议我 AWS 中的任何服务都可以做长时间的 运行 需要与 RDS 持续交互的作业,以将文件数据与系统数据进行比较。

通常您会希望所有 HTTP 请求 尽可能短,这意味着您永远不会在 HTTP 请求中执行任何实际工作。所有实际工作都将在通过其他方式调用的 Lambda 函数中完成,而不是 API 网关。一般流程是这样的:

  1. 客户端上传大文件,在 return 中获取此上传的唯一 ID。
  2. 服务器将文件解析为数据库记录。
  3. 服务器开始处理这些数据库记录。
  4. 客户端可以随时通过id查询处理状态

举个例子,我实现了这样一个系统:

  1. 浏览器上传大 Excel 文件,该文件逐行读取并写入数据库,一次成批数百行,所有文件都标记有相同的随机 UUID。当请求结束时,该文件将自然丢弃。此批处理 reading/writing 已经过优化,因此即使是非常大的文件也可以在几秒钟内推送到数据库中。
  2. 作为结束上传过程之前的最后一个操作,SQS 消息与上传记录的 UUID 一起排队。
  3. SQS 队列调用一个 Lambda 函数,该函数查询具有该 UUID 的所有记录,并将新的 SQS 消息放入队列中,每条记录的 ID 为几十个(即消息到“处理记录 1” -20”、“21-40”等)。
  4. 队列再次调用另一个 Lambda 处理程序,它一条一条地处理每条记录。

所以,大上传被分解成单独的记录,然后是单独的批次记录,然后每个记录被单独处理,每个单独的步骤不会超过几秒钟,并分布在单独的 Lambda 中实例。

这不仅允许并行处理许多记录,而且永远不会接近 15 分钟的 Lambda 超时。 HTTP 请求也永远不会接近 30 秒的限制,因为最初的 parse-and-store 步骤不会花费很长时间,并且每个后续请求只需要查看数据库的处理状态并且不需要任何事情本身。根据您的需要,即使初始 parse-and-store 步骤也需要超过 30 秒,您可以将文件上传到 S3,然后触发 Lambda 函数从那里处理它。

如果这些步骤中的任何,即使像这样最小化和分解,花费的时间超过 15 分钟的 Lambda 超时,那么 Lambda 不是这项工作的正确平台.

1.Process the file and store into transaction tables.
My Question is for large files

API 网关有一些负载限制,所以它真的不适合传递更大的负载。

大内容的常见做法是使用 API 服务到 return presigned url,客户端可以很容易地使用它来将内容上传到 S3

然后您可以使用另一个 API 资源或 S3 events 来调用创建对象的操作(启动进程、批处理作业...)。

2.After user approval Process data to Active tables.

现在的问题是什么是审批流程,什么是“流程数据”,可能需要多长时间,需要什么资源。

如果假设它是一个包含多个步骤的漫长 运行 过程,可以使用 AWS Step Function 协调任务可能是一个不错的选择,但这取决于您的用例。

对于较长的 运行 作业,可以使用 AWS Batch、EMR(或其他计算资源),如果您设法将工作分解为可管理的部分,甚至可以使用 SQS+Lambda。