芹菜。运行单个芹菜节拍 + 多个芹菜工人规模

Posted

技术标签:

【中文标题】芹菜。运行单个芹菜节拍 + 多个芹菜工人规模【英文标题】:Celery. Running single celery beat + multiple celery workers scale 【发布时间】:2021-10-24 02:29:41 【问题描述】:

有单一的芹菜节拍运行:

celery -A app:celery beat --loglevel=DEBUG

还有三个跑过的工人:

celery -A app:celery worker -E --loglevel=ERROR -n n1
celery -A app:celery worker -E --loglevel=ERROR -n n2
celery -A app:celery worker -E --loglevel=ERROR -n n3

相同的 Redis DB 用作所有工作人员和节拍的消息代理。 所有工作人员都出于开发目的在同一台机器上开始,而他们将在生产环境中使用不同的 Kubernetes pod 进行部署。主要思想是使用多个工作人员在不同的 Kube Pod 之间分配 50-150 个任务,每个 Pod 在 4-8 核机器上运行。 我们预计任何 pod 都不会承担比他拥有的核心更多的任务,直到存在任何工作的任务少于可用核心的工作人员,因此要同时执行最大数量的任务。

所以我在本地测试它时遇到了麻烦。 这里是本地beat触发三个任务:

[2021-08-23 21:35:32,700: DEBUG/MainProcess] Current schedule:
<ScheduleEntry: task-5872-accrual Task5872Accrual() <crontab: 36 21 * * * (m/h/d/dM/MY)>
<ScheduleEntry: task-5872-accrual2 Task5872Accrual2() <crontab: 37 21 * * * (m/h/d/dM/MY)>
<ScheduleEntry: task-5872-accrual3 Task5872Accrual3() <crontab: 38 21 * * * (m/h/d/dM/MY)>
[2021-08-23 21:35:32,700: DEBUG/MainProcess] beat: Ticking with max interval->5.00 minutes
[2021-08-23 21:35:32,701: DEBUG/MainProcess] beat: Waking up in 27.29 seconds.
[2021-08-23 21:36:00,017: DEBUG/MainProcess] beat: Synchronizing schedule...
[2021-08-23 21:36:00,026: INFO/MainProcess] Scheduler: Sending due task task-5872-accrual (Task5872Accrual)
[2021-08-23 21:36:00,035: DEBUG/MainProcess] Task5872Accrual sent. id->96e671f8-bd07-4c36-a595-b963659bee5c
[2021-08-23 21:36:00,035: DEBUG/MainProcess] beat: Waking up in 59.95 seconds.
[2021-08-23 21:37:00,041: INFO/MainProcess] Scheduler: Sending due task task-5872-accrual2 (Task5872Accrual2)
[2021-08-23 21:37:00,043: DEBUG/MainProcess] Task5872Accrual2 sent. id->532eac4d-1d10-4117-9d7e-16b3f1ae7aee
[2021-08-23 21:37:00,043: DEBUG/MainProcess] beat: Waking up in 59.95 seconds.
[2021-08-23 21:38:00,027: INFO/MainProcess] Scheduler: Sending due task task-5872-accrual3 (Task5872Accrual3)
[2021-08-23 21:38:00,029: DEBUG/MainProcess] Task5872Accrual3 sent. id->68729b64-807d-4e13-8147-0b372ce536af
[2021-08-23 21:38:00,029: DEBUG/MainProcess] beat: Waking up in 5.00 minutes.

我希望每个worker 都将执行单个任务来优化工作人员之间的负载,但不幸的是它们的分布方式如下:

所以我不确定不同的工作人员之间如何同步以在他们之间顺利分配负载?如果不能,我能以某种方式实现吗?尝试在 Google 中搜索,但主要是关于单个 worker 中的任务之间的并发,但是如果我需要同时运行比 Kube claster 中的单个机器更多的任务该怎么办?

【问题讨论】:

您是否尝试将worker_prefetch_multiplier 配置值设置为1?如果设置为 1,则每个 worker 中的每个处理器只能执行一项任务。因此,如果您的节拍将 8 个任务发送到队列。那么worker n1(比如每个worker被设置为2个并发级别)最多同时处理2个任务。这将导致工人 n2 接 2 个其他任务,n3 2 个其他任务...... 我会试试的!非常感谢!您能否添加问题的答案,以便我投票? 【参考方案1】:

为了实现你想要的,你应该做两件事:

使用-O fair 选项运行工作程序。示例:celery -A app:celery worker -E --loglevel=ERROR -n n1 -O fair 在您的配置中使用 worker_prefetch_multiplier=1 使工作人员尽可能少地预取。

【讨论】:

像魅力一样工作!非常感谢!

以上是关于芹菜。运行单个芹菜节拍 + 多个芹菜工人规模的主要内容,如果未能解决你的问题,请参考以下文章

芹菜工人和一个命令击败负载

Celery Beat:一次限制为单个任务实例

芹菜节拍服务旧(已删除)任务

芹菜工人并发

芹菜节拍不接周期性任务

芹菜节拍进程在启动时分配大量内存