Старые значения возвращаются из memcached при использовании нескольких узлов и бесконечных TTL
Я сталкиваюсь с проблемой, когда у меня есть клиент python-memcached, подключающийся к 3 узлам memcached на ElastiCache. У меня есть некоторые значения кэша с бесконечным TTL, и они переопределяются при обновлении источника данных. Кэш также записывается в случае отсутствия кеша.
Проблема иногда в том, что старые кэшированные значения возвращаются memcached. Мое лучшее предположение относительно того, что происходит:
- "foo" записывается в memcached A.
- memcached A временно недоступен в процессе #1, поэтому он помечен как сбойный.
- Процесс # 1 использует memcached B, который имеет пропущенный кеш, поэтому он записывает "bar" в memcached B и возвращает это значение.
- процесс #2 может подключиться к memcached A и не знает, что процесс # 1 пометил его как плохой узел, поэтому он подключается и возвращает "foo".
- всякий раз, когда процесс может подключиться к memcached, возвращается "foo", но в любое время он временно помечается как мертвый memcached B, к которому подключен, и "bar" возвращается.
Вот строка, где сбой приводит к выбору нового сервера: https://github.com/linsomniac/python-memcached/blob/release-1.57/memcache.py
Я посмотрел на клиента хеширования для pymemcached и думаю, что он сделает то же самое: временно удалит хост memcached и попытается использовать другой.
Это имеет смысл, когда хост будет удален навсегда, но не имеет смысла для меня, когда хост может быть недоступен в течение нескольких секунд. Я что-то пропустил? Являются ли бесконечные TTL мемкашированным анти-паттерном?