Как установить время ожидания извлечения Memcached в Django

Как изменить время ожидания для сервера кэширования Memcached/Elasticache в Django?

Я использую Amazon Elasticache для кэширования контента в Django и часто вижу такие ошибки, как:

  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/template/defaulttags.py", line 285, in render
    return nodelist.render(context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/template/base.py", line 830, in render
    bit = self.render_node(node, context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/template/base.py", line 844, in render_node
    return node.render(context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/templatetags/static.py", line 109, in render
    url = self.url(context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py", line 12, in url
    return staticfiles_storage.url(path)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 136, in url
    hashed_name = self.cache.get(cache_key)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/core/cache/backends/memcached.py", line 64, in get
    val = self._cache.get(key)
Error: error 31 from memcached_get(myproject:1:staticfiles:27e4bc0): A TIMEOUT OCCURRED

Я пытался увеличить количество узлов в своем кластере Elasticache, но это не дало никакого эффекта. Следующей моей мыслью было увеличить время ожидания для извлечения из memcached, но документы Django не кажутся предоставить вариант для этого.

Есть параметр «TIMEOUT», но он, похоже, определяет время по умолчанию, после которого содержимое истечет, а не время ожидания HTTP-запроса к серверу memcached.


person Cerin    schedule 24.07.2015    source источник
comment
Действительно ли это тайм-аут HTTP-запроса к серверу memcached или, может быть, внутренний тайм-аут на сервере memcached?   -  person Konstantin Schubert    schedule 25.01.2017


Ответы (2)


Решение, которое я выбрал, состояло в том, чтобы переключить мой бэкенд кеша Django на django-ft-cache. , отказоустойчивая версия стандартного бэкэнда memcache. Так что теперь, когда происходит периодический тайм-аут, кеш просто переходит к извлечению медиафайлов без кеша вместо того, чтобы выдавать ошибку 500.

person Cerin    schedule 26.01.2017

В django нет настройки для этого. Что-то вроде этого должно работать, хотя это довольно грязно. Перед созданием кеша убедитесь, что выполняется следующее:

import memcached; memcached._SOCKET_TIMEOUT = whatever_you_want_it_to_be;
person Konstantin Svintsov    schedule 26.01.2017