0

我有 4 个 EC2 服务器运行带有 uWSGI 的 Django 1.3.2 应用程序。他们都在 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. 是查询集缓存问题吗?我还没有找到这个问题的答案,也不知道如何。

一切都在单个服务器上按预期工作,但是一旦有多个服务器,我就会开始体验这种行为。

4

1 回答 1

0

模块级变量绝对是个问题——查询集只有在不使用(迭代、评估等)时才是“惰性”的,一旦你开始检索记录,它就会填充缓存(提示:Django 是开源的,当文档不够时,您可以只 ReadTheCode(tm))。

如果您使用 InnoDB 表,您可能还会遇到事务隔离级别的问题(参见 Django 在最后一点上的文档)。

于 2013-04-18T20:12:51.433 回答