Текущая ситуация
Получил проект, использующий: spring-boot
, spring-cloud
, postgresql
в качестве микросервисной системы.
Есть 2 сервиса, скажем SA и SB, они работают с 2 базами данных СУБД соответственно, скажем, DA и DB. .
Теперь есть операция, содержащая 2 подэтапа:
- HTTP-клиент сделает запрос к службе SA, чтобы сохранить запись
RA
вDA
. - Затем SA отправляет запрос в службу SB, чтобы сохранить запись
RB
вDB
.
В целом, два подэтапа должны либо фиксироваться, либо откатываться.
Анализ
- Если переместить обе операции в одну службу, то можно использовать распределенную транзакцию Spring для совмещения ее с JTA (на основе протокола
2PC
). - Но здесь 2 операции выполняются в 2 службах, и они обмениваются данными по протоколу http REST. Возможно, для решения этой проблемы можно использовать mq + компенсацию, но я не уверен, что есть лучший подход.
Вопросы
- В этом случае работает ли JTA (на основе
2PC
протокола)? - If not, what is the preferred solution?
Possible solutions I can guess:- Refactor code to move the 2 operations into a single service.
- Реализуйте архитектуру mq + компенсация для поддержки этого.
2PC
- этоguaranteed
для распределенной транзакции, с учетом стоимости производительности, проблема заключается в производительности, если существует n сублокальных транзакций, то самая медленная из них определяет общее время глобальной транзакции. IMO,2PC
легче реализовать с помощью инструментов, предоставляемых Java и Spring, по сравнению с решениемmq and compensation
. - person user218867   schedule 14.10.2019