请问 celery 有什么负载均衡的办法吗?如何让加入队列的任务平均分配在每个 worker 节点上呢?
目前小弟用 celery 搭了一套共 7 个 worker 节点的系统,主要是用于分散数据文件生成的任务,避免单个节点 I/O 过高,性能太差。目前小弟有几个问题:
1、一次性大量通过 apply_async 调用异步任务时,worker 对任务的获取是抢占式的,导致各个节点上的任务并不平均,有的节点早早就结束了所有的任务闲了下来,但是其他节点还在埋头苦干,请问 celery 有什么负载均衡的办法吗?如何让加入队列的任务平均分配在每个 worker 节点上呢?
2、worker 对于任务是先抢光队列里面的所有任务,然后再执行任务。请问是否有办法让每个节点只获取 worker_concurrency 数量的任务,哪个 process 完成了再去队列中获取呢?
谢谢大家~ ----------------------- 以下是精选回复-----------------------
答:这个问题不应该解决队列吧。
能详细讲讲具体做什么吗?这个抢占指的又是什么?是网络还是?有 ack 吗?
答:记得有个参数可以设置 worker 一次取几个任务,设置为 1 就好。
具体的需要查文档了。
答:http://docs.celeryproject.org/en/latest/userguide/optimizing.html#prefetch-limits
答:有个 prefetch_count. 如果这个还觉得不够, 可以参考一下我写的一个任务框架
https://github.com/jiajunhuang/toq
里面有个模式是 sleepy mode, 如果任务过多,就会停止拉取任务
答:1. 给每个 worker 合理的设定--concurrency、--autoscale 参数
2. 同问题 1,有没有其他答案观察 ing
答:别用 celery 了 用 dask
0条评论