Распределенный кэш в Java с использованием ehcache RMI

Требование: у меня есть 4 сервера: A, B, C, D. Все они подключаются к поставщику данных, получают данные и сохраняют их в mongodb в течение N минут. Так что, если в следующий раз тот же запрос поступит на другой сервер, он будет брать данные только из mongodb вместо того, чтобы звонить поставщику данных.

|A|
|B|    |data provider|
|C|
|D|

Но если |поставщик данных| ответ медленный, есть вероятность, что 2 разных запроса на один и тот же ресурс поступят в A, B. Я хочу, чтобы один запрос ждал, пока не будет получен ответ на первый запрос. Я использую для этого очередь, которая подходит для одного сервера. Но теперь мне нужен распределенный кеш из-за нескольких серверов.

Реализация. Прочитав несколько статей в сети, я узнал, что распределенный кэш в Java можно реализовать с помощью репликации ehcache RMI. Но у меня мало сомнений, прежде чем продолжить эхчаче. (Хотя есть и другие решения, такие как JCS и т. д., я решил выбрать ehcache на основе других ответов на StackOverflow)

Сомнения

  • Что делать, если один из серверов выйдет из строя? Обрабатывает ли ehcache это автоматически?

person Amit Kumar Gupta    schedule 17.12.2014    source источник


Ответы (2)


Интересная ситуация, но я тоже не понимаю, как дополнительный кеш (любого рода) поможет решить проблему. В конечном итоге ваша проблема сводится к координации между серверами, и кеш мало что может добавить.

Вместо этого я бы либо использовал очередь, разделяемую четырьмя серверами, где одновременно разрешен только один запрос на ресурс. Другая возможность — общая карта, где каждый сервер будет блокировать имя ресурса при его извлечении. Затем другие серверы могут ожидать эту блокировку и, как только она будет освобождена, попытаться получить ресурс из MongoDB.

Я не пробовал его использовать, но использовал комбинацию redis и redisson хорошо подходит для такой задачи.

person Martin    schedule 17.12.2014
comment
Спасибо, Мартин, дай посмотреть - person Amit Kumar Gupta; 18.12.2014

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

Распределенный Ehcache, поддерживаемый Terracotta, может помочь, поскольку вы можете объединить строгую согласованность с CacheLoader, чтобы получить, что только один поток между серверами загружает данный ресурс. Но если вы не готовы придерживаться Terracotta 3.7.x, это больше не вариант с открытым исходным кодом.

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

person Louis Jacomet    schedule 18.12.2014
comment
Да, вы правы, репликация отличается от общего кеша/данных. - person Amit Kumar Gupta; 18.12.2014