请问 celery 有什么负载均衡的办法吗?如何让加入队列的任务平均分配在每个 worker 节点上呢?

2017-10-27 21:36:04 +08:00
 praynise
目前小弟用 celery 搭了一套共 7 个 worker 节点的系统,主要是用于分散数据文件生成的任务,避免单个节点 I/O 过高,性能太差。目前小弟有几个问题:
1、一次性大量通过 apply_async 调用异步任务时,worker 对任务的获取是抢占式的,导致各个节点上的任务并不平均,有的节点早早就结束了所有的任务闲了下来,但是其他节点还在埋头苦干,请问 celery 有什么负载均衡的办法吗?如何让加入队列的任务平均分配在每个 worker 节点上呢?
2、worker 对于任务是先抢光队列里面的所有任务,然后再执行任务。请问是否有办法让每个节点只获取 worker_concurrency 数量的任务,哪个 process 完成了再去队列中获取呢?
谢谢大家~
3398 次点击
所在节点    Python
9 条回复
GooMS
2017-10-27 21:48:32 +08:00
这个问题不应该解决队列吧。
能详细讲讲具体做什么吗?这个抢占指的又是什么?是网络还是?有 ack 吗?
gamexg
2017-10-27 21:51:00 +08:00
记得有个参数可以设置 worker 一次取几个任务,设置为 1 就好。
具体的需要查文档了。
gamexg
2017-10-27 21:53:16 +08:00
herozem
2017-10-27 21:54:52 +08:00
有个 prefetch_count. 如果这个还觉得不够, 可以参考一下我写的一个任务框架

https://github.com/jiajunhuang/toq

里面有个模式是 sleepy mode, 如果任务过多,就会停止拉取任务
DoctorCat
2017-10-27 21:57:30 +08:00
1. 给每个 worker 合理的设定--concurrency、--autoscale 参数
2. 同问题 1,有没有其他答案观察 ing
praynise
2017-10-27 22:29:59 +08:00
@herozem 膜拜下大神…
est
2017-10-27 22:52:20 +08:00
别用 celery 了 用 dask
praynise
2017-10-27 23:22:11 +08:00
@est dask 不是类 pandas 的数据处理包吗…
mathgl
2017-10-30 13:47:38 +08:00
@praynise 用做任务队列也可以。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX