Как синхронизировать экземпляры микросервисов, работающих в кластере Jetty, используя Java Spring - PullRequest
0 голосов
/ 28 января 2019

Я занимаюсь разработкой микросервиса Java 8 Spring 5, который работает на встроенном сервере Jetty.Я намереваюсь создать несколько экземпляров этого микросервиса, поэтому будет несколько серверов Jetty, работающих одновременно на разных портах, по одному для каждого порожденного экземпляра.

Все экземпляры совместно используют одну и ту же базу данных, которая является базой данных MongoDB.

Изнутри моего микросервиса я вызываю сторонний REST Web Service.Я сохраняю данные, возвращенные этим REST WS, в моей базе данных, поэтому все экземпляры кластера могут воспользоваться запросом, сделанным одним из экземпляров.

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

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

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

Я искал возможность транзакции MongoDBs 4.0, чтобы попытаться заблокировать документ во время вызова службы, но безуспешно (все еще :)).

1 Ответ

0 голосов
/ 28 января 2019

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

Это то, что базы данных действительно хороши.Благодаря специально созданному уникальному индексу вы получите именно это.Для этого вам даже не нужны транзакции, потому что у вас будет только одна коллекция (таблица).

Решение состоит в том, чтобы использовать оптимистическую блокировку.Я не использовал себя в Java (только в PHP), но нашел этот вопрос , который может вам помочь.Короче говоря, вы используете @org.springframework.data.annotation.Version для свойства.

Вы должны определить новый объект, представляющий удаленный фрагмент данных, имеющий свойство state со следующими возможными значениями: old (по умолчанию) fetching и fetched.Когда локальная служба нуждается в данных, она загружает объект и проверяет статус:

  • , если статус fetched, то использует его;
  • , если статус old, затем он пытается изменить его на fetching;если база данных отклоняет это из-за одновременного изменения, то она должна ждать, пока статус не станет fetched;если сохранение выполнено успешно, он вызывает удаленную службу и сохраняет результат в Entity как свойство;
  • , если статус fetching, следует подождать, пока он не станет fetched.
...