在 ECS Fargate 中操作 Celery Worker

Posted

技术标签:

【中文标题】在 ECS Fargate 中操作 Celery Worker【英文标题】:Operating the Celery Worker in the ECS Fargate 【发布时间】:2019-04-12 14:37:34 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

Fargate 启动类型比 EC2 启动类型需要更长的时间来启动,因为当您启动任务时,AWS 会为您完成所有“主机操作”,包括众所周知的缓慢连接 ENI,并且可能会下载来自 Docker 存储库的图像。目前没有竞争,EC2 启动类型每次都更快。

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


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

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

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

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


示例集群

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

EC2 启动类型 Celery 服务

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

最小任务:2,期望:4,最大任务:4

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

无扩展策略

Fargate 启动类型 Celery 服务

最小任务:0,期望:(x),最大任务:32

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

向该服务添加扩展策略

【讨论】:

这是我们仍然使用普通 EC2 的主要原因,我们为特定队列实施了自己的自动缩放器,可按需现场请求新的 EC2 实例。【参考方案2】:

你的想法很棒!但你错过了什么,

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

任务完成时芹菜不会停止。它仍然会运行并等待其他任务,因此 ECS 只查看 celery 并且它运行 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 

【讨论】:

以上是关于在 ECS Fargate 中操作 Celery Worker的主要内容,如果未能解决你的问题,请参考以下文章

Auto-Scaling 移除 ECS 服务中正在运行的任务 (FARGATE)

带有 docker hub 映像的 ECS FARGATE TASK 定义

如何在 ECS Fargate 任务定义中配置主机名

如何使用 Fargate 在 AWS ECS 中正在运行的容器中运行命令

在 ECS Fargate 上获取 CannotPullContainerError

AWS ECS Fargate 从跨账户 ECR 存储库中提取映像