Старые значения, возвращаемые из memcached при использовании нескольких узлов и бесконечных TTL

#memcached #amazon-elasticache #python-memcached

#memcached #amazon-elasticache #python-memcached

Вопрос:

Я столкнулся с проблемой, когда у меня есть клиент python-memcached, подключающийся к 3 узлам memcached в ElastiCache. У меня есть некоторые значения кэша, которые имеют бесконечный TTL, и они переопределяются при обновлении источника данных. Кэш также записывается в случае промахов кэша.

Проблема в том, что memcached иногда возвращает старые кэшированные значения. Мое лучшее предположение о том, что происходит, это:

  1. «foo» записывается в memcached A.
  2. memcached A временно недоступен в процессе # 1, поэтому он помечен как сбой.
  3. процесс # 1 использует memcached B, в котором отсутствует кэш, поэтому он записывает «bar» в memcached B и возвращает это значение.
  4. процесс # 2 может подключаться к memcached A и не знает, что процесс # 1 пометил его как плохой узел, поэтому он подключается и возвращает «foo».
  5. каждый раз, когда процесс может подключиться к memcached, возвращается «foo», но всякий раз, когда он временно помечен как мертвый, подключается memcached B и возвращается «bar».

Вот строка, в которой сбой приводит к выбору нового сервера:https://github.com/linsomniac/python-memcached/blob/release-1.57/memcache.py#L413

Я посмотрел на клиент хеширования для pymemcached, и я думаю, что он сделает то же самое: временно удалит узел memcached и попытается использовать другой.

Это имеет смысл, когда хост будет удален навсегда, но не имеет смысла для меня, когда хост может быть недоступен в течение нескольких секунд. Я что-то упускаю? Являются ли бесконечные TTL антишаблоном memcached?