【问题标题】:Django querysets in a distributed application分布式应用程序中的 Django 查询集
【发布时间】:2013-04-12 01:36:29
【问题描述】:

我有 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. 是查询集缓存问题吗?我还没有找到答案,也不知道怎么解决。

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

【问题讨论】:

    标签: mysql django amazon-ec2 django-queryset rds


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-28
      • 1970-01-01
      • 2019-07-01
      • 2011-08-18
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多