我们刚刚将Django项目迁移到了Heroku,并将所有媒体和静态文件都放在了Amazon S3上(使用django-storages和s3-boto)。
尽管我听说过Amazon S3的运行非常快,并且由于性能下降而导致的结果很少,但是我们的图像加载速度已经减慢到绝对爬网的速度,并且经常超时。超时的代码示例是我们模型之一的此属性,该属性尝试选择适当的图像,最终退回到返回None
的位置:
@property
def photo(self):
"""Transparently serve the best available image for templates"""
if self.model_shot.storage.exists(self.model_shot.name):
return self.model_shot
elif self.image.storage.exists(self.image.name):
return self.image
else:
return None
在导致问题的模型上进行测试时,我尝试了以下操作:
$ heroku run python manage.py shell
...
>>> design = Design.objects.get(pk=10210)
>>> design.photo
此命令导致外壳程序挂起了几秒钟,最后才返回
ImageFieldFile
对象。随后对其的调用立即返回,这使我相信结果已被缓存。我的问题是,处理此问题的最佳方法是什么?我已经听说过很多在这种情况下使用CloudFront的信息,但这绝对不是由于流量高(我们网站上基本上没有流量)引起的。其他缓存框架?还有其他东西吗?
大多数有问题的图片至少为1000x1000像素。
最佳答案
随着生产规模的扩大,我在生产现场遇到了类似的问题。我建议使用的存储后端可以维护自己的有关S3文件的所有元信息的副本。最好的此类项目可能是MimicDB,尽管您也可以查看我对modified django-storages所做的事情。这样,像.exists()
,.url
等元数据查询就可以从本地缓存中立即得到答复。
另外,请确保您通常只获取image
对象的URL或其他元数据,而不要使用任何会导致服务器不必要地获取实际图像数据的代码。设置此类内容时,我想做的就是修改S3包装器(例如boto),以便它将记录每个原始的S3 REST请求,然后测试该站点并确保仅查看站点上的网页不会导致来自Web服务器的任何S3请求。
关于python - default_storage.exists极其缓慢且经常超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24685790/