我们正在使用Django Celery进行后台数据处理,将一个CSV文件(最大15MB)转换成字典数据列表(其中还包括一些Django模型对象),并将其分成块以在子任务中处理。
所有任务在由Celery管理的后台并发进程中运行。我们最初使用了Redis后端,但发现它在高并发和峰值负载情况下会经常耗尽内存(参考链接)。因此,我们转而使用了Django的基于文件的缓存后端。虽然这解决了内存问题,但我们发现20-30%的缓存条目从未被写入。没有任何错误提示,只是默默失败。当我们用CLI查找缓存时,我们会发现例如chunk_id_7和chunk_id_9存在,但chunk_id_8不存在。因此,间歇性地,某些缓存条目无法保存。
我们更换了diskcache后端并观察到相同的情况,尽管缓存故障似乎降低到了5-10%(非常粗略的估计)。
我们注意到在过去的Django基于文件的缓存中存在并发进程问题,但这似乎在很多年前就被修复了(我们使用的版本是v1.11)。一条评论说,这个缓存后端更像是一个POC,但不确定它是否已经改变。
文件缓存是一个生产质量的缓存解决方案吗?如果是,是什么导致了我们的写入故障?如果不是,那么针对我们的用例有什么更好的解决方案?
@task
def main_task(data):
i = 0
for chunk in chunk_up(data):
chunk_id = "chunk_id_{}".format(i)
cache.set(chunk_id, chunk, timeout=FIVE_HOURS)
sub_task.delay(chunk_id)
i += 1
@task
def sub_task(chunk_id):
data_chunk = cache.get(chunk_id)
... # do processing
所有任务在由Celery管理的后台并发进程中运行。我们最初使用了Redis后端,但发现它在高并发和峰值负载情况下会经常耗尽内存(参考链接)。因此,我们转而使用了Django的基于文件的缓存后端。虽然这解决了内存问题,但我们发现20-30%的缓存条目从未被写入。没有任何错误提示,只是默默失败。当我们用CLI查找缓存时,我们会发现例如chunk_id_7和chunk_id_9存在,但chunk_id_8不存在。因此,间歇性地,某些缓存条目无法保存。
我们更换了diskcache后端并观察到相同的情况,尽管缓存故障似乎降低到了5-10%(非常粗略的估计)。
我们注意到在过去的Django基于文件的缓存中存在并发进程问题,但这似乎在很多年前就被修复了(我们使用的版本是v1.11)。一条评论说,这个缓存后端更像是一个POC,但不确定它是否已经改变。
文件缓存是一个生产质量的缓存解决方案吗?如果是,是什么导致了我们的写入故障?如果不是,那么针对我们的用例有什么更好的解决方案?