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 提交