Подтвердить что ты не робот

Как установить тайм-аут получения 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 docs, похоже, не дает возможности для этого.

Здесь есть опция "ВРЕМЯ", но, похоже, определяет время по умолчанию, по истечении которого заканчивается контент, а не таймаут HTTP-запроса на сервер memcached.

4b9b3361

Ответ 1

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

Ответ 2

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

import memcached; memcached._SOCKET_TIMEOUT = whatever_you_want_it_to_be;