Java - несколько микроуслуг одна база данных - PullRequest
0 голосов
/ 28 августа 2018

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

Я использую CrudRepository интерфейс Spring для автоматического получения bean-компонента, в котором реализовано несколько методов sql, таких как save().

Таким образом, микросервис B отправляет через балансировщик нагрузки сериализованный объект для сохранения в один из экземпляров A, который затем сохраняет его в базе данных оракула (совместно используемой всеми экземплярами службы A). Должен ли я быть осторожным, когда 2 экземпляра A пытаются получить доступ к базе данных oracle одновременно?

Кроме того, что произойдет, если у меня будет только 1 экземпляр A и 2 экземпляра B, которые одновременно попытаются отправить сериализованные объекты на A? Должен ли кто-то из них автоматически ждать или я должен каким-то образом это контролировать?

Спасибо за помощь

1 Ответ

0 голосов
/ 28 августа 2018

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

Должен ли я быть осторожным, когда 2 экземпляра A пытаются получить доступ к базе данных oracle одновременно?

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

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

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

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

Кроме того, что произойдет, если у меня будет только 1 экземпляр A и 2 экземпляра B, которые пытаются одновременно отправить сериализованные объекты в A?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...