Dockerized Celery 部署无需强制 KILL 工作人员(ECS | Beanstalk 多容器)

Posted

技术标签:

【中文标题】Dockerized Celery 部署无需强制 KILL 工作人员(ECS | Beanstalk 多容器)【英文标题】:Dockerized Celery deployment without force KILL workers (ECS | Beanstalk multi container) 【发布时间】:2019-05-30 03:05:18 【问题描述】:

我有一个Dockerrun.aws.json 文件,它使用 Beanstalk 多容器在 EC2 实例上部署 celery 容器。

在每次部署时,默认情况下 Beanstalk 或 ECS 代理会杀死所有实例上现有的 celery 容器,然后创建一个新的 celery 容器。这会不成熟地杀死 celery 任务,这会造成问题,因为任务无法完成。

celery 容器有supervisord,它实际上监控 celery 进程并在它出现故障时将其启动。

有人可以建议我们如何通过允许芹菜容器/进程完成他们已经从 SQS 消耗的任务来优雅地杀死它们吗?

【问题讨论】:

【参考方案1】:

一种解决方案是创建一个任务,您可以使用该任务在部署之前让工作人员处于空闲状态。

基本上,创建一个任务:

向您发送通知,确认它已准备好被杀死 正确删除 SQS 消息以确保它不会在将来重新执行。 进入无限循环以防止其他任务在给定任务上执行。不仅仅是一个无限循环,我建议你睡 30 分钟或任何你想用作部署窗口的东西(以防部署失败并且你希望能够恢复)

您的部署将是:

发布 SQS 让工作人员入睡 正常部署。当新 Worker 活跃时,它会自动开始处理新任务。

【讨论】:

以上是关于Dockerized Celery 部署无需强制 KILL 工作人员(ECS | Beanstalk 多容器)的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 上部署 Dockerized Symfony2 应用程序

如何在 celery 任务中强制 django-orm 中的单个保存的 db 提交

如何在 Celery 任务执行期间强制执行记录器格式?

AWS Elastic Beanstalk 上的 Dockerized 节点。错误 502 BadGateway

数据在多容器 Dockerized 应用程序中的啥位置?

通过SBT进行Dockerized Scala应用程序的Marathon健康检查