kubernetes - celery 。运行单个 celerybeat + 多个 celeryworker 规模

标签 kubernetes celery celery-task celerybeat

让单个 celery 节拍运行:

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

以及三个正在运行的 worker :

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将执行单个任务来优化worker之间的负载,但不幸的是它们是如何分配的:

enter image description here

所以我不确定不同的工作人员之间如何同步以在它们之间顺利分配负载?如果不能,我能以某种方式实现这一目标吗?尝试在 Google 中搜索,但大多数都是关于单个工作程序中的任务之间的并发性,但是如果我需要同时运行比 Kube 集群中的单台机器更多的任务该怎么办?

最佳答案

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

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

关于kubernetes - celery 。运行单个 celerybeat + 多个 celeryworker 规模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68897681/

相关文章:

kubernetes - Prometheus 查询以获取 kubernetes pod 中的 CPU 和内存使用情况

python - 如何使用同一个 worker 重试 celery ?

django - Celery:许多小任务还是一个长时间运行的任务?

multiprocessing - celery 是如何工作的?

kubernetes - Kubernetes难题:从文件(装入的卷)填充环境变量

kubernetes - Gloo TCP代理(按主机名)

authentication - EKS 集群不提供 client-ca-file

python - 如何使用 MySQL 中的日期时间在 Celery 中执行任务?

python - 在 Celery 任务中获取生成文件的 URl 的最佳方法是什么

django - 为什么 Celery 任务测试结果不一致?