是否有人将 django celery worker 实现为 docker 容器,它仅在分配任务时运行

Posted

技术标签:

【中文标题】是否有人将 django celery worker 实现为 docker 容器,它仅在分配任务时运行【英文标题】:Is anyone implemented django celery worker as docker container it only runs when task assigned 【发布时间】:2020-01-03 13:09:31 【问题描述】:

我能够使用 FARGATE 作为计算成功地将 Django Celery worker 部署为 AWS ECS 服务中的 docker 容器。

但我担心的是 celery 容器 24/7 全天候运行。如果我只能在分配任务时运行容器,我可以根据 AWS FARGATE 计费方法节省大量资金。

【问题讨论】:

您应该能够轻松地将在 AWS Fargate 上运行的容器打包为单个任务。如果你有一个正在运行的 docker 容器(你可以在 Fargate 上手动运行它),那么任务就变得微不足道了。 @DejanLekic 是否有任何基于任务和任务完成以及 eta 任务的自动启停方式的解决方法 我不知道... 您好,您对此有任何更新吗?我目前正在解决同样的问题。你用什么经纪人做芹菜? Redis、SQS、RabbitMQ? @JameelGrand 你知道如何在 AWS Fargate 上启动多个 celery 工作者吗?如果是的话,你能分享一些例子吗? 【参考方案1】:

Celery 并不是真正适合使用的东西,因为它旨在持久化,但目标应该相当容易实现。

在架构上,您可能希望在 Fargate 任务上运行脚本。脚本通过队列咀嚼然后死亡。你会以某种方式触发该任务:

来自数据接收器(例如 Django)的 API 调用 一个 lambda 函数(由什么触发?)

还有一些悬而未决的问题...您是一次只完成一项任务,还是需要管理对队列的并发请求?你重试吗?但一个合理的起点。


一种不推荐但可能更简单的方法是在 Django 容器中运行 celery worker(例如使用 supervisor)并使用 Fargate 的自动缩放功能。您将始终运行一个 Django 容器来接收数据。如果该容器上的 celery worker 用完所有可用资源,Fargate 将通过添加任务来扩展服务。工作完成后,它会移除多余的容器。您将在每个容器中为 Django 支付“开销”,但它的成本可能低于始终在线的 celery 容器,而且肯定会更简单——利用您的 celery 体验并避免额外的事件处理层。

编辑:这个版本的另一个缺点是你需要在某个地方运行 Redis,我发现它的最低成本相对较高。


根据我不断增长的 AWS 经验,您可能应该这样做...

    使用AWS API Gateway 作为事件/请求的永远在线接收器。您只需为请求付费,免费套餐包括每月 100 万,接下来的 3 亿是 1 美元 (pricing),所以这很可能是免费的。 虽然您有很多选项可以响应请求,但 AWS Lambda 函数(可以用 python 编写)的开销应该最少。 如果您的队列运行时间超过 Lambda 函数允许的时间(15 分钟),您需要让该 Lambda 函数将处理委托给例如Fargate 任务。 (可选)如果您想为您的 Fargate 任务使用 Dockerhub 容器,由于 Dockerhub 的速率限制,我们遇到了一系列任务和服务无法启动的问题。我们最终将 Fargate 任务包装在 Step Function 中,专门检查了此错误并重试。 (可选)如果您需要限制并发,this SO answer 建议让您的 Lambda 函数检查现有执行(Step Function 或 Fargate 任务)。我希望 Fargate Tasks 或 Step Functions 有原生的东西,但我什么也没看到。

我想这将比永远在线的 Fargate 任务和 Elasticache Redis 队列节省大量运营成本,但前期成本/麻烦可能超过节省的成本。

【讨论】:

【参考方案2】:

你有没有想过用AWS Lambda 代替芹菜工人?然后,您将按任务执行付费,其中成本由执行时间和内存使用量决定。如果您有一个大部分空闲的应用程序,那么按请求付费,跳过空闲成本,将是最有意义的。

【讨论】:

Lambda 有严格的时间限制,这使得它们在许多用例中毫无用处...... 由于时间限制,AWS Lambda 不适用于批处理

以上是关于是否有人将 django celery worker 实现为 docker 容器,它仅在分配任务时运行的主要内容,如果未能解决你的问题,请参考以下文章

Django Celery 结果将任务 ID 设置为人类可读的内容?

Django 和 Celery 的示例:周期性任务

Django-Celery 进度条

是否可以显示 django celery 任务的进度条? [复制]

Django celery crontab 每 30 秒 - 有可能吗?

python celery 多work多队列