Dom*_*eon 5 amazon-ec2 amazon-ecs celery autoscaling aws-auto-scaling
我正在 AWS ECS 集群中运行 Python Celery(分布式任务队列库)工作人员(每个 EC2 实例运行 1 个 Celery 工作人员),但任务需要长时间运行并且不是幂等的。这意味着,当发生自动扩展缩减事件时,即 ECS 由于任务负载过低而终止运行工作线程的容器之一时,该工作线程上当前正在进行的长时间运行的任务将永远丢失。
有人对如何配置 ECS 自动缩放有任何建议,以便在完成之前不会终止任何任务吗?理想情况下,ECS 缩减事件将对要终止的 EC2 实例中的 Celery Worker 启动热关闭,但只有在 Celery Worker 完成热关闭(在其所有任务完成之后才会实际终止 EC2 实例)。完全的。
我还了解有一种称为实例保护的东西,它可以通过编程方式进行设置,并防止实例在缩减自动缩放事件中被终止:https ://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance -termination.html#instance-protection-instance
但是,我不知道在所有任务在热关闭中完成后会触发任何 Celery 信号,因此我不确定如何以编程方式知道何时禁用保护。即使我找到了一种在适当的时候禁用保护的方法,谁来管理首先向哪个工作人员发送关闭信号?EC2 是否可以配置为在缩减事件中对实例执行自定义操作(例如执行热 celery 关闭),而不是仅仅终止 EC2 实例?
我认为,当 ECS 缩减您的任务时,它会发送 SIGTERM,等待 30 秒(默认)并使用 SIGKILL 终止任务的容器。
我认为您可以使用此变量增加信号之间的时间:ECS_CONTAINER_STOP_TIMEOUT。
这样,您的 celery 任务就可以完成,并且不会向该 celery Worker 添加新任务(收到 SIGTERM 后热关闭)。
这个答案可能对您有帮助: /sf/answers/3469485631/
| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |