让单个 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之间的负载,但不幸的是它们是如何分配的:
所以我不确定不同的工作人员之间如何同步以在它们之间顺利分配负载?如果不能,我能以某种方式实现这一目标吗?尝试在 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/