尝试使用python-rq
来支持我们的Web应用程序的后端,但是推送新作业需要很长时间-高达12秒。
当执行enqueue_call
函数调用时,性能会受到影响,特别是当连接到系统的工作进程数量增加(超过200个)时。
系统工作方式如下:
- 前端向任务队列服务器推送作业。它使用
enqueue_call
函数向作业传递参数(如timeout和ttl),以及要执行的函数的实际参数。 - 多个进程(分布在几台机器上)正在运行工作进程,每个进程在UNIX
screen
下运行。worker遵循文档中提供的模式,执行Worker.work()
无限循环函数来监听队列。 - 在处理过程中,一些任务产生新的任务,通常在它们运行的同一队列上。
关于基建:
- 运行此任务队列的Redis服务器专用于此任务队列。此外,持久性也被禁用。它运行在一个4gb的Rackspace服务器上。
- 当在服务器上运行
redis-benchmark
和任务队列时,我们得到的结果在大多数基准测试中平均超过20000 r/s。
在这种情况下,我们如何提高新工作的推送性能?我们应该使用更好的模式吗?
12秒?这太疯狂了。
你考虑过用芹菜吗?
从未使用过redis-rq,但从我看到的文档来看,它对大量工人来说不是很好
Redis队列通常基于BLPOP命令,它可以与多个客户端一起工作,但谁知道它真正可以处理多少一个键。
所以我建议你切换到芹菜或者为python-rq编写自己的任务分发器,这不会比切换