Скажем, у нас есть микросервисы пользователя, кошелька REST и шлюз API, который склеивает все вместе. Когда Боб регистрируется на нашем веб-сайте, нашему шлюзу API необходимо создать пользователя через микросервис пользователя и кошелек через микросервис Кошелька.
Вот несколько сценариев, в которых все может пойти не так:
-
Создание пользователя Боба: это нормально, мы просто возвращаем сообщение об ошибке Бобу. Мы используем транзакции SQL, поэтому никто никогда не видел Боба в системе. Все хорошо:)
-
Пользователь Bob создан, но до того, как наш Кошелек может быть создан, наш шлюз API сильно сработает. Теперь у нас есть Пользователь без кошелька (непоследовательные данные).
-
Создан пользователь Bob Bob, и когда мы создаем Кошелек, HTTP-соединение падает. Возможно, создание кошелька преуспело, или, возможно, не было.
Какие существуют решения для предотвращения такого несоответствия данных? Существуют ли шаблоны, позволяющие транзакциям охватывать несколько запросов REST? Я прочитал страницу Wikipedia на двухфазном коммите, который, похоже, затрагивает эту проблему, но я не уверен, как применить ее на практике. Эта статья Atomic Distributed Transactions: документ RESTful кажется интересной, хотя я еще не прочитал ее.
В качестве альтернативы, я знаю, что REST может просто не подходит для этого варианта использования. Возможно, правильный способ справиться с этой ситуацией, чтобы полностью удалить REST и использовать другой протокол связи, такой как система очереди сообщений? Или я должен обеспечить согласованность кода приложения (например, если у вас есть фоновая работа, которая обнаруживает несоответствия и исправляет их или имеет атрибут "состояние" в моей модели пользователя с "созданием", "созданными" значениями и т.д.)?