我有4个EC2服务器运行Django 1.3.2应用程序与uWSGI。它们都在Amazon RDS上共享一个MySQL服务器。我正在经历一些行为,如果一个新的对象是通过管理创建的,我尝试:
get_object_or_404(Class, pk=new_object.pk)
有时它会找到一个对象,但有时它会返回一个404。
发生了什么事?
这就是我如何使用get_object_or_404:
# Module level variables
if settings.DEBUG:
articles = News.objects.filter(status='live')
else:
articles = News.objects.all()
dev view(request, slug):
article = get_object_or_404(articles, slug=slug)
....
如果我重新启动所有的uWSGI进程,问题就会消失。
问题和我尝试过的事情:
- 是模块级变量的问题?我试着调试这个,但由于查询集是懒惰的,它似乎不像一个问题。
- 是缓存问题吗?我已经重启了memcache并清除了Nginx的缓存,但问题仍然存在。
- 是RDS问题吗?我还没有找到这个问题的答案。
- 是查询集缓存问题吗?我没有找到这个问题的答案,也不知道是怎么回事。
在单台服务器上一切正常,但一旦有多台服务器,我就开始体验这种行为
模块级变量绝对是一个问题——查询集只有在不使用时才会"偷懒"(迭代、求值等),一旦你开始检索记录,它就会填充缓存(提示:Django是开源的,当文档不够时,你可以直接读取代码)。
如果你使用InnoDB表,你可能也会遇到事务隔离级别的问题(参考Django的文档中最后一点)。