将SQS连接到ECS (Fargate)或将SQS连接到Lambda再连接到ECS。

3
这个问题更多是关于如何构建ETL管道的架构问题。目前,我有一个通过SQS调用的AWS Lambda。但是处理数据可能需要超过15分钟(AWS的运行时限制),并且使用sam build进行部署会导致.zip大于250MB,因此会抛出错误。因此需要一种替代AWS Lambda的方法。迄今为止我看到的替代方案有:

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

我没有发现任何有关这两个选项的优缺点和通常首选选项的提示。有关如何处理此类问题的任何提示吗?


只是一个小建议 - 如果您的任务受到 CPU 限制,将 Lambda 内存增加到 1.7GB 将加快速度。即使您不需要那么多内存,少于这个值会给您提供一个相应的 CPU 分数。(而且由于比例更快,它的成本大约相同。) - falsePockets
1个回答

7
我没有发现任何关于这两个选项优缺点的提示,也不知道一般哪个是首选。有什么方法可以解决吗?
当 Lambda 的 15 分钟限制或部署文件大小限制成为问题时,建议考虑使用 ECS Fargate。
需要注意的是,当您将 SQS 配置为 Lambda 的事件源时,AWS 在幕后实际上运行了一个进程来轮询 SQS 队列中的消息,然后使用这些消息调用 Lambda 函数。SQS 没有将消息“推送”到任何地方,它是一个“拉取”服务。
因此,在迁移到 ECS 时,您需要更改代码以便它轮询要处理的 SQS 消息。一般的配置方式是有一个 Docker 镜像,在生成容器时就无限期轮询 SQS 队列,处理接收到的任何消息。然后根据 SQS 队列中的消息数量配置自动缩放。当队列中没有消息时,ECS 可以缩减到零个运行任务。当队列中有消息时,ECS 可以根据需要扩展到运行任意数量的任务以处理消息。在这种设置中不需要使用 Lambda。

谢谢,解释得非常好。我推断这个SQS轮询是通过boto3实现的。不过不清楚的是,Docker容器是否包含了SQS轮询代码,并且在ECS中处于“休眠”状态,或者我理解错了吗? - pymat
1
我不确定你所说的“dormant”是什么意思。您将创建一个包含代码的Docker镜像。该镜像将存储在AWS ECR存储库中。ECS将根据需要从该镜像创建运行容器。当SQS队列中没有消息时,它可以缩减到0个运行容器(以节省成本)。 - Mark B
好的,我现在明白了。所以当这个消息出现在队列中时,容器开始运行并轮询该队列以获取消息,然后将其解析为应用程序的其余部分。 - pymat
2
是的,完全正确。您有两个监视队列的东西:1. ECS自动缩放,它只检查“ApproximateNumberOfMessagesVisible”指标,以查看是否有可用于处理的消息,以便扩展或缩小正在运行的容器数量。2. Docker容器内的SQS轮询代码,在容器运行时从队列中拉取实际消息。 - Mark B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接