Конфигурирование машины Django Cache на Heroku Memcachier?

Я хотел бы использовать замечательное приложение Cache Machine Django ( https://github.com/jbalogh/django-cache-machine), используя Memcachier на Heroku.

Насколько я понимаю, Cache Machine не работает из коробки с Memcachier, потому что Memcachier требует проверки подлинности PyLibMC и SASL (см. https://devcenter.heroku.com/articles/memcachier). Cache Machine говорит, что поддерживает PyLibMC - и все, что вам нужно сделать, это вставить "caching.backends.memcached.PyLibMCCache" в параметр CACHES.

Однако, когда вы делаете это, вы получаете эту ошибку: "ошибка 47 из memcached_set: СЕРВЕР СБОЙ И ОТКЛЮЧЕНО ДО ВРЕМЕННОГО ПОВТОРА"

Я думал, что причина этого в том, что caching.backends.memcached.PyLibMCCache наследуется от django.core.cache.backends.memcached.PyLibMC (см. https://github.com/jbalogh/django-cache-machine/blob/master/caching/backends/memcached.py), где он должен наследоваться от django_pylibmc.memcached.PyLibMCCache для работы на Heroku (но это своего рода выстрел в темноте).

Я сделал свой собственный пользовательский бэкэнд кеша, который вместо этого унаследован от django_pylibmc.memcached.PyLibMCCache, но теперь, когда я проверяю свою панель Heroku Memcachier, не похоже, что все, что я делаю, увеличивает кеш - он застрял на 50 мб, хотя Я ожидаю, что он будет расти с каждым набором запросов.

Кто-нибудь успешно настроил Cache Machine на Heroku? Если так, как ты это сделал?

1 ответ

Я работаю с MemCachier. Раньше мы не имели дело непосредственно с Cache Machine, но я просто создал небольшое приложение, чтобы убедиться, что оно отлично работает на Heroku и MemCachier.

Быстрый фон, если вы не очень знакомы с memcache и MemCachier. Существует два протокола для общения между клиентом и сервером. Один старше ascii протокол, а другой новее binary протокол. Мы в MemCachier только поддерживаем binary протокол, поскольку он поддерживает аутентификацию в то время как ascii протокол не

Вы делаете ошибку, используя caching.backends.memcached.PyLibMCCache в качестве бэкэнда кеша. В то время как pylibmc это клиент memcache, который мы рекомендуем, так как он поддерживает binary протокол и аутентификация sasl, интерфейс кеша, который поставляется с Django, к сожалению, не поддерживает включение бинарного протокола. Таким образом, pylibmc просто идет по умолчанию, который является ascii протокол и не удается.

Вы можете увидеть билет на Django по этому вопросу здесь.

Таким образом, в MemCachier мы всегда рекомендуем вам использовать альтернативу django-pylibmc-sasl пакет. Этот пакет использует pylibmc также, но предоставляет интерфейс кеша, отличный от того, который предоставляет django, который поддерживает включение двоичного протокола и аутентификацию. Это обсуждается в нашей документации здесь.

Вот код, который я обычно помещаю в settings.py настроить кеш Django с помощью MemCachier:'

## MemCachier Settings
## ===================
def get_cache():
  # We do this complicated cache defenition so that on a local machine (where
  # MEMCACHIER_SERVERS won't be defined), the try fails and so we use the
  # inbuilt local memory cache of django.
  try:
    os.environ['MEMCACHE_SERVERS'] = os.environ['MEMCACHIER_SERVERS'].replace(',', ';')
    os.environ['MEMCACHE_USERNAME'] = os.environ['MEMCACHIER_USERNAME']
    os.environ['MEMCACHE_PASSWORD'] = os.environ['MEMCACHIER_PASSWORD']
    return {
      'default': {
        'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
        'TIMEOUT': None,
        'BINARY': True,
        'OPTIONS': {
          'tcp_nodelay': True,
          'no_block': True,
          'tcp_keepalive': True,
          '_poll_timeout': 2000,
          'ketama': True,
          'connect_timeout': 2000,
          'remove_failed': 4,
          'retry_timeout': 2,
          'dead_timeout': 10
        }
      }
    }
  except:
    # Use django local development cache (for local development).
    return {
      'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
      }
    }

CACHES = get_cache()

Это также облегчит разработку на вашей локальной машине MEMCACHIER_SERVERS не определен, он будет возвращаться к простому локальному кешу django, избегая необходимости локальной установки memcache.

надеюсь, это поможет Джейку!

Другие вопросы по тегам