在 ECS Fargate 中运行 Celery Worker

Operating the Celery Worker in the ECS Fargate

我正在使用 AWS ECS 处理一个项目。我想使用 Celery 作为分布式任务队列。 Celery Worker 可以构建为 EC2 类型,但由于实例处于空闲状态的时间很长,我认为 AWS Fargate 运行 作业并立即退出会很划算。

您对如何在 AWS 云中高效使用 Celery Worker 有什么建议吗?

Fargate 启动类型比 EC2 启动类型需要更长的时间来启动,因为 AWS 会在您启动任务时为您完成所有 "host things",包括非常慢的 ENI 附加,并且可能是从 Docker 存储库下载图像。现在没有竞争,EC2 启动类型每次都更快。

所以这实际上取决于您希望员工从事的工作类型。由于上述原因,您可以预期新的 Fargate 任务需要 几分钟 才能进入 运行 状态。另一方面,EC2 启动,因为 ENI 已经在您的主机上就位并且图像已经下载(最好)或大部分下载(可能最差),将从 PENDING 快速移动到 运行。


对稳定的工作负载使用 EC2 启动类型,对突发容量使用 Fargate 启动类型

这是当前流行的观点,经常作为成本因素进行讨论,因为 Fargate 无法利用典型的 EC2 成本节约机制,如预留实例和现货定价。与 EC2 相比,运行 Fargate 一直都很昂贵。

明确地说,在 Fargate 中 运行 100% 完全没问题(我们这样做),但您必须愿意接受这样做的缺点 - 扩展速度较慢且成本较高。

注意 您可以 运行 在同一集群中使用两种启动类型。无论如何,集群是合乎逻辑的,只是一种组织资源的方式。


示例集群

此示例显示静态 EC2 启动类型服务 运行ning 4 个芹菜任务。任务的数量、规格、实例大小等等都无关紧要,随心所欲。重要的是 - EC2 启动类型服务不需要扩展;根据您的扩​​展规则,Fargate 启动类型服务能够从 运行ning(在很少或没有工作要做的时期)扩展到您可以处理的尽可能多的工作人员。

EC2 启动类型 Celery 服务

运行 1 EC2 启动类型 t3.medium (2vcpu/4GB).

最少任务:2,需要:4,最多任务:4

运行 在此 EC2 启动类型中,512/1024 处有 4 个 celery 任务。

无扩展策略

Fargate 启动类型 Celery 服务

最小任务:0,所需:(x),最大任务:32

运行 (x) celery 任务(与 EC2 启动类型相同的任务定义)在 512/1024

向该服务添加扩展策略

你的想法很棒!但是你错过了一些东西,

celery 是一个工人,而不是它应该 运行 24/7 的任务。

celery 不会在任务完成时停止。它仍然会 运行s 并等待其他任务,因此 ECS 只查看 celery 并且 运行s 24/7。所以 ECS 永远不知道 celery 任务的开始和结束。

如果 celery down 分配任务时谁会调出 celery?您的消息代理和 ECS 之间没有连接来启动 celery。

实际上,celery 有能力 运行 根据消息队列按需任务,如果它 运行 是 24/7。否则,没有人知道分配了新任务。

解决方案 1: 替换 celery 并重写你的所有逻辑以支持 ECS 任务并根据你的需要为 ECS 任务创建触发机制。

FYI: the above solution needs lot of efforts and not a practical