2013-04-18 2 views
0

У меня есть 4 сервера EC2 с приложением Django 1.3.2 с uWSGI. Все они используют сервер MySQL на Amazon RDS. Я испытываю некоторое поведение, где, если новые объекты создаются через администратор, и я стараюсь:Задания Django в распределенном приложении

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. Проблема с кэшем запросов? Я не нашел ответа на этот вопрос и не знаю, как это сделать.

Все работает так, как ожидается, на одном сервере, но, как только у вас будет несколько серверов, я начну испытывать поведение.

ответ

0

Переменные уровня модуля, безусловно, являются проблемой - запросы являются «ленивыми» только до тех пор, пока они не используются (итерация, оценка и т. Д.), Как только вы начнете получать записи, они заполняют кеш (подсказка: Django is open-source, вы можете просто ReadTheCode (tm), когда документа недостаточно).

У вас могут быть проблемы с уровнем изоляции транзакции, если вы используете таблицы InnoDB (cf Django's doc в этой последней точке).

Смежные вопросы