Конфигурирование машины 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.
надеюсь, это поможет Джейку!