SQS 到 ECS (Fargate) 或 SQS 到 Lambda 到 ECS

pym*_*mat 3 etl amazon-sqs amazon-ecs aws-lambda

这个问题更多的是一个关于如何最好地构建 ETL 管道的架构问题。目前,我有一个通过 SQS ping 的 AWS Lambda。但处理数据可能需要 15 分钟多一点(AWS 的运行时间限制),并且使用 forsam build部署会导致 .zip 大于 250MB,因此会引发错误。因此需要 AWS Lambda 的替代方案。到目前为止我看到的替代方案是:

SQS -> ECS (Fargate) SQS -> Lambda -> ECS (Fargate)

我没有找到任何关于这两个选项的优缺点的提示,以及通常首选的选项。关于如何解决这个问题有什么建议吗?

Mar*_*k B 7

我没有找到任何关于这两个选项的优缺点的提示,以及通常首选的选项。关于如何解决这个问题有什么建议吗?

一旦您开始遇到 15 分钟限制或 Lambda 的部署文件大小限制,那么可能就该迁移到 ECS Fargate 了。

请注意,当您将 SQS 配置为 Lambda 的事件源时,AWS 实际上在幕后运行一个进程,该进程轮询 SQS 队列中的消息,然后使用这些消息调用您的 Lambda 函数。SQS 从不将消息“推送”到任何地方,它是一种“拉”服务。

考虑到这一点,当迁移到 ECS 时,您需要更改代码,以便它轮询 SQS 来处理要处理的消息。一般来说,配置它的方法是拥有一个 docker 镜像,当它作为容器生成时,只需永远轮询 SQS 队列,处理它收到的任何消息。然后根据SQS队列中的消息数量配置ECS自动伸缩。当队列中有0条消息时,ECS可以缩减至0个正在运行的任务。当队列中有消息时,ECS 可以扩展到您希望运行的任务数量以处理消息。此设置中不需要 Lambda。

  • 对,就是这样。您有两件事来监控队列: 1. ECS AutoScaling,它只是检查“ApproximateNumberOfMessagesVisible”指标,以查看是否有可用于处理的消息,以扩大或缩小正在运行的容器的数量。2. docker 容器内的 SQS 轮询代码,用于在容器运行时从队列中提取实际消息。 (2认同)