Распределенная транзакция между сервисами в микросервисной системе с использованием Spring-Cloud - PullRequest
3 голосов
/ 14 октября 2019

Текущая ситуация

Получил проект, использующий: spring-boot, spring-cloud, postgresql, в качестве микросервисной системы.

Есть 2 службы, скажем SA и SB , они работают с 2 базами данных RDBMS соответственно, скажем, DA и DB .

Теперь естьоперация содержит 2 подэтапа:

  1. Http-клиент сделает запрос на обслуживание SA , чтобы сохранить запись RA в DA.
  2. Затем SA отправляет запрос на обслуживание SB , чтобы сохранить запись RB, в DB.

В целом,2 подэтапа должны либо зафиксировать, либо выполнить откат.


Анализ

  • Если переместить обе операции в один сервис, то можно использовать распределенную транзакцию Spring, чтобы выполнить ее сJTA (на основе протокола 2PC) .
  • Но здесь 2 операции выполняются в 2 сервисах и они обмениваются данными по протоколу http REST. Может быть, можно использовать mq + компенсация , чтобы решить эту проблему, но я не уверен, есть ли лучший подход.

Вопросы:

  • В этом случае JTA (на основе протокола 2PC) все еще работает?
  • Если нет, какое предпочтительное решение?
    Возможные решения, которые я могу догадаться:
    1. Код рефакторинга для перемещения двух операций в один сервис.
    2. Реализация архитектуры mq + Компенсация для поддержки этого.
...