多个 celery worker 执行同一类型任务的场景,如何合理获得任务被执行在哪个 worker 上面?

2018-10-25 14:39:51 +08:00
 hanssx
场景是这样的,假设我有一种类型的 celery task,
task name:scan.xxx
celery config 里面配置了 scan.xxx 这个任务路由到 scan_tasks 这个队列中(采用得是 rabbitMQ )
同时有多个 worker 同时在监听该队列,比如 host1 host2 host3,concurrent = 4 (也就是每个 worker 最大并发为 4 个进程)

现在的场景:
需要我知道某个任务被哪一个 worker (或者说哪一个 host )执行了,目的是想获取所有 worker (所有 host )的情况,比如负载百分之多少,运行了几个进程,当前状态(idle running)等

现在的方案:
任务使用 apply_async()函数被异步执行时传递指定的队列名,这样的话
queue1 -> host1
queue2 -> host2
queue3 -> host3
这样会有问题:
如果以后我要增加任务执行的效率,提高程序性能,不关闭程序的情况下,我要预先开辟多个队列(假设现在考虑最多 10 个 worker ) queue1、queue2、queue3、...、queue10,十分不优雅
还有一种方案是在任务执行时,get_ip()然后记录,得到是在哪台机器上执行的,但是同样感觉很不优雅
对了,最后还有一种方案是 celery flower,但是它的 api 不稳定,我现在看看,有没有不借助 flower 的方案呢

不知各位有没有这样的场景,都是怎么做的,总感觉会有优雅的方案。
2303 次点击
所在节点    Python
3 条回复
hanssx
2018-10-25 15:27:58 +08:00
kslr
2018-10-25 15:44:32 +08:00
如果一台机器运行 20 个,那不是要浪费 19 次吗?
为什么不单独监听呢,不管是其他监控报警和扩展都好处理
hanssx
2018-10-26 14:18:06 +08:00
@kslr 兄弟没听明白你的意思,我只在一台机器运行一个 worker,在 20 台机器运行 20 个 worker。。

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

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

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

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

© 2021 V2EX