모놀로식 시스템에서의 트랜잭션 사용

모놀로식 서비스에서는 로컬 트랜잭션을 사용한다. 그림 처럼 사용자가 주문을 넣으면 트랜잭션이 시작되고 데이터가 수정되어 커밋되고 응답을 받게된다. 만일 트랜잭션 시작이후에 오류가 발생했다면 롤백이 될 수 있다. 이것이 ACID라고 알려져있는 것이다.

마이크로서비스에서의 트랜잭션 사용

위의 모놀로식 시스템을 분해하여 여러 시스템으로 구성된 마이크로서비스를 만든다면 다음과 같은 그림이 될 것이다.

마이크로서비스에서는 각각의 서비스에서 데이터에 접근하고 수정을할텐데 어떻게 실패단계에서의 트랜잭션을 거칠수가 있을까?

각각의 서비스에서 트랜잭션의 시작과 끝은 있지만 비지니스 로직 단계에서 봤을 때는 각 마이크로서비스의 작업을 하나의 작업으로 봐야한다. 실패단계에서 롤백이 일어나야하는데 만일 응용 프로그램에서 다른 인스턴스가 데이터를 변경했을 수 있으므로 단순하게 롤백작업을 진행할 수는 없다.

해결방법

여기서 나오는 개념이 보상 트랜잭션이다. 보상 트랜잭션은 원래 작업의 스탭에서 이전 상태로 취소가 되어야한다. 보상트랜잭션은 비지니스 로직이 수행이 진행될 때 각 단계에서 수행한 작업을 실행 취소하는 방법에 대한 정보를 기록한다. 특정 시점에 작업이 실패하면 workflow는 완료된 단계 이전으로 되돌아가고, 각 단계를 되돌리는 작업을 수행한다. 보상 트랜잭션은 정확히 거꾸로 돌아가는 것이 아니라 로직에 따라 실행 취소 단계를 동시에 수행할 수 있다.

보상 트랜잭션은 최종적으로 일관된 작업이고, 실패할 수도 있다. 시스템은 오류 발생 지점에서 보상 트랜잭션을 다시 시작하고 계속할 수 있어야한다.

출처

[Compensating Transaction in Microservices by Javed Iqbal CodeX Medium](https://medium.com/codex/compensating-transaction-in-microservices-15b1f88a7c29)