@vega2475

Вопрос с собеседования на Java Бекенд. Как гарантировать согласованность операций?

Этот вопрос мне задали на собеседовании на стажера в МТС Банк.
С клиентского приложения приходит запрос на нашу API, чтобы обработка запроса включается в себя:
  • Запись в Базу Данных нашего сервиса (запись в БД)
  • Отправить запрос на сторонний API (и например на том стороннем сервисе тоже запись в БД этого стороннего сервиса)


Вопрос заключался в следующем:
Что нужно сделать, чтобы гарантировать то, что изменения применятся либо везде либо нигде?


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

Я так и не смог дать грамотного ответа.
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
Я не из МТС банка, но у нас в собесе тоже есть похожий вопрос, но я бы не назвал его простым, так как там дальше ещё много дополнительных вопросов и обсуждений можно невертеть.

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

Самый простой и часто используемый вариант - Outbox.

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

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

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

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

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

66ab5b548e5a9142225375.png

Благодаря тому что мы записываем основные бизнес-данные и намерение сделать запрос в сторонний сервис в одной транзакции - мы гарантируем, что мы не будем отправлять запрос, если данные не записались и наоборот - если данные записались, то мы гарантируем, что попытаемся рано или поздно отправить запрос.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Автор, почитай про шаблон SAGA.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы