Текущая ситуация
Получил проект, использующий: spring-boot
, spring-cloud
, postgresql
, в качестве микросервисной системы.
Есть 2 службы, скажем SA и SB , они работают с 2 базами данных RDBMS соответственно, скажем, DA и DB .
Теперь естьоперация содержит 2 подэтапа:
- Http-клиент сделает запрос на обслуживание SA , чтобы сохранить запись
RA
в DA
. - Затем SA отправляет запрос на обслуживание SB , чтобы сохранить запись
RB
, в DB
.
В целом,2 подэтапа должны либо зафиксировать, либо выполнить откат.
Анализ
- Если переместить обе операции в один сервис, то можно использовать распределенную транзакцию Spring, чтобы выполнить ее сJTA (на основе протокола
2PC
) . - Но здесь 2 операции выполняются в 2 сервисах и они обмениваются данными по протоколу http REST. Может быть, можно использовать mq + компенсация , чтобы решить эту проблему, но я не уверен, есть ли лучший подход.
Вопросы:
- В этом случае JTA (на основе протокола
2PC
) все еще работает? - Если нет, какое предпочтительное решение?
Возможные решения, которые я могу догадаться: - Код рефакторинга для перемещения двух операций в один сервис.
- Реализация архитектуры mq + Компенсация для поддержки этого.