处理大任务结果时应如何使用Celery?
如何处理在Celery中执行的大结果任务是个好问题?比如说一些像表格导出这样的任务,结果可能会有几百兆字节那么大。
我在想,把这些大数据直接塞进结果数据库的简单做法可能不太行,尤其是如果我用AMQP作为结果后端的话。不过,有些情况下延迟是个问题;根据导出的具体情况,有时候我需要等到结果返回,然后才能把导出的数据直接发给请求的客户端(比如说,有个HTTP请求想要导出内容,但这个内容还不存在,但无论如何都必须在响应中提供... 不管这需要多长时间)。
那么,处理这些任务的最佳方法是什么呢?
2 个回答
1
我通过把我的应用程序设计成将几兆字节的结果写入文件来处理这个问题,然后我把这些文件映射到内存中,这样所有使用这些数据的进程都可以共享它们……这样就完全解决了如何把结果传到另一台机器的问题。不过,如果结果这么大,听起来这些任务都是在服务器进程之间协调的内部任务。
5
一种选择是在你所有的工作机器上运行一个静态的HTTP服务器。这样,你的任务就可以把大的结果保存到一个独特的文件里,并返回一个指向这个文件的URL链接。接收者可以在方便的时候去获取这个结果。
比如,可能是这样的:
@task
def dump_db(db):
# Some code to dump the DB to /srv/http/static/db.sql
return 'http://%s/%s.sql' % (socket.gethostname(), db)
当然,你还需要一些方法来处理旧文件,以及确保文件名的唯一性,可能还有其他问题,但你大概明白这个思路了。