2016-08-29 4 views
0

Я использую EhCache 2.10.2. Синхронная репликация (replicateAsynchronously = false) между двумя серверами (S1 и S2).Репликация кеша

У меня следующая ситуация:

  1. Первый запрос HTTP будет S1
  2. S1 не может найти объект в кэше и загружает его из БД с состояния «А» и помещает в кэш
  3. S1 изменения состояния объекта в «B», сохраняет в БД и помещает в кэш
  4. S1 посылает ответ об успешном
  5. Следующий запрос собирается S2
  6. S2 находит obect в са che с состоянием «A»
  7. S2 отправляет ответ об ошибке, поскольку объект должен иметь состояние «B» во втором запросе.

Когда сервер ставит объект в кеш, поток блокируется при операции ввода только для отправки сериализованного объекта на другой сервер и не ждет, пока другой сервер десериализует и кладет элемент в кеш. Итак, в точке 6 может быть состояние «A» или «B», если нам повезет.

Возможно ли настроить EhCache для блокировки операций до тех пор, пока изменения не будут реплицированы на всех узлах?

Может быть, мне нужно заменить EhCache другой реализацией кэша или изменить все?

ответ

0

То, что вы испытываете, является слабостью репликации кеша. Кажется, что ваш сценарий требует сильной согласованности.

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

Единственная особенность Ehcache, которая даст вам надлежащие гарантии, - Terracotta clustering. Чтобы развернуть это решение, вам понадобится как минимум один дополнительный сервер/JVM для работы в качестве кластера Terracotta.