我有一个长期运行的芹菜任务,它会吐出一些文件。任务的结果是存储文件的文件夹位置和运行时间。
e.g:
@app.task()
def my_task():
start = time.time()
folder = my_heavy_function()
end = time.time()
return json.dumps({ 'folder': folder, 'time': end-start })
在异步调用任务之前,我将元数据存储在mongodb中 - 正在启动任务,描述等的用户。
e.g。
def endpoint(req, resp, user, description):
doc = MyMongoDbDocument(
user=user
description=description
)
task = my_task.delay()
doc.task_id = task.id
doc.save()
resp.status = HTTP_OK
resp.body = doc.to_json()
为了在这种情况下坚持结果,我可以想到两种可能的方法:
使用芹菜后端存储结果(例如redis)。要将结果链接到元数据,请将任务ID存储在元数据中。
让任务使用结果数据更新元数据。
这里的最佳做法是什么? 我可以在两种情况下看到优点和缺点:
这意味着客户端必须进行两次调用才能检索与该任务相关的所有信息。 1获取元数据和任务ID,另一个端点获取任务ID的AsyncResult
并返回结果数据。它还意味着更少的数据位置。相关数据位于不同的地方。另一方面,它意味着没有重复的数据和代码位置 - 即我没有访问各个位置的(元数据)数据库。
1次调用以获取所有数据。但是,这意味着将mongodb文档id传递给任务,打开与数据库的另一个连接并更新它。这里可能存在写冲突的可能性。此外,即使假设所有的数据库访问代码都在一些库中被巧妙地抽象化,我认为它并不像干1那样。