我正在使用Amazon Web Services ECS(弹性容器服务)。 我的任务定义包含Application + Redis + Celery,这些容器在任务定义中定义。设置了自动缩放,因此目前有三个具有相同镜像基础结构的实例。但是,对于计划任务需要Celery Beat实例,因此Celery Beat将是一个很好的工具,因为Celery已经在我的基础架构中。
但问题是:如果我将Celery Beat容器与其他容器一起添加(将其添加到任务定义中),它将被镜像,并且多个实例将在同一时刻执行相同的计划任务。什么是这个基础设施问题的解决方案?我应该创建一个单独的服务吗?
答案 0 :(得分:3)
我们使用single-beat
来解决这个问题,它就像一个魅力:
单拍是一个很好的小应用程序,只能确保一个 您的流程实例在您的服务器上运行。
如celerybeat(或某种日常邮件发件人,孤儿文件 清洁等...)只需要在一台服务器上运行,但如果是这样的话 服务器停机,好吧,你去另一台服务器等启动它。
您仍应将服务所需的任务数设置为1.
答案 1 :(得分:2)
您可以使用ECS任务放置策略来放置Celery Beat任务并选择“每个主机一个任务”。确保选择Desire state为“1”。通过这种方式,您的芹菜节拍任务将仅在您的群集中的1个容器中运行。
价: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_run_task.html
所需任务是您要在群集中运行的任务数。您可以在配置服务时或在运行任务部分中设置“任务数”。您可以参考以下链接以获取参考。
配置服务:
价: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service.html
运行任务:
价: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_run_task.html
如果您发现任何问题,请与我联系。