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

Я сталкиваюсь с проблемой, когда у меня есть клиент 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

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

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

0 ответов

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