2016-06-14 3 views
1

Несколько экземпляров того же ServiceA работают на разных jvm. Но все они используют одни и те же данные бэкэнд из базы данных.Распределенное кэширование во избежание дублирования запросов

Когда есть запрос от клиента, ServiceA просматривает, если данные доступны в его базе данных, если он не запрашивает другой ServiceB для получения этих данных и хранения этого в его базе данных и возвращает его обратно клиенту.

Если два клиента запросят одновременно и два экземпляра ServiceA обрабатывают эти запросы, оба этих экземпляра могут эффективно вызвать ServiceB для получения этих данных. Как я должен обрабатывать этот случай, так что в SerivceB будет только один запрос.

ответ

0

Что вы можете сделать, это применить хеш к запросу и проверить очередь запросов, если запрос уже присутствует.

Чтобы получить, чтобы работать эффективно вы также должны знать, где вы посылаете запрос урезанный в случае нескольких серверов кэширования:

Предположим, вам 2 кэширование назад концы: Вы хотите быть отказоустойчивой и эффективной.

Эффективность: Это может быть сделано с помощью простого МОДУЛЯ над хеш, в котором модуль определяет, к какому серверу вы говорите

терпимы Fault должен быть частью слоя связи, где вы определить, если кэширование обратно конец фактически доступны и где вы определяете, как отступить.

1

2 добавьте к чему @norbert-van-nobelen сказал;

Есть еще две возможности.

  • Один, чтобы ваш ServiceB решить, какой запрос обрабатывать
  • Другой вариант, чтобы разрешить ServiceA синхронизировать с ServiceB и иметь дело с условием гонки.

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

пример; http://blogs.alachisoft.com/distributed-locking/

Смежные вопросы