分布式应用中的Django查询集



我有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进程,问题就会消失。

问题和我尝试过的事情:

  1. 是模块级变量的问题?我试着调试这个,但由于查询集是懒惰的,它似乎不像一个问题。
  2. 是缓存问题吗?我已经重启了memcache并清除了Nginx的缓存,但问题仍然存在。
  3. 是RDS问题吗?我还没有找到这个问题的答案。
  4. 是查询集缓存问题吗?我没有找到这个问题的答案,也不知道是怎么回事。

在单台服务器上一切正常,但一旦有多台服务器,我就开始体验这种行为

模块级变量绝对是一个问题——查询集只有在不使用时才会"偷懒"(迭代、求值等),一旦你开始检索记录,它就会填充缓存(提示:Django是开源的,当文档不够时,你可以直接读取代码)。

如果你使用InnoDB表,你可能也会遇到事务隔离级别的问题(参考Django的文档中最后一点)。

相关内容

  • 没有找到相关文章

最新更新