분산 트랜잭션은 간단해 보이지만 문제점도 많습니다. 일단 NoSQL DB(예: MongoDB, 카산드라(Cassandra))와 현대 메시지 브로커(예: RabbitMQ, 아파치 카프카)는 분산 트랜잭션을 지원하지 않으므로 분산 트랜잭션이 필수라면 최근 기술은 상당수 포기할 수밖에 없습니다.
동기 IPC 형태라서 가용성이 떨어지는 문제점도 있습니다. 분산 트랜잭션은 참여한 서비스가 모두 가동 중이어야 커밋할 수 있습니다. 3장에서 배웠듯이, 가용성은 트랜잭션 참여자의 가용성을 모두 곱한 값입니다. 99.5% 가용한 두 서비스가 참여한 트랜잭션의 전체 가용성은 99%로 개별 서비스 가용성보다 낮고, 더 많은 서비스가 참여할수록 가용성은 더 떨어집니다. 에릭 브루어(Eric Brewer)의 CAP 정리(theorem)에 따르면, 시스템은 일관성(consistency), 가용성(availability), 분할 허용성(partition tolerance) 중 두 가지 속성만 가질 수 있습니다.6 요즘 아키텍트들은 일관성보다 가용성을 더 우선시하는 편입니다.
개발자 관점에서 분산 트랜잭션은 로컬 트랜잭션과 프로그래밍 모델이 동일하므로 매력적이지만, 지금까지 설명한 문제점 때문에 요즘 애플리케이션에는 잘 맞지 않습니다. 분산 트랜잭션을 사용하지 않고 메시지를 DB 트랜잭션의 일부로 전송하는 방법은 3장에서 배웠습니다. 마이크로서비스 아키텍처에서 데이터 일관성을 유지하려면, 느슨하게 결합된 비동기 서비스 개념을 토대로 뭔가 다른 메커니즘이 절실합니다. 이것이 바로 사가입니다.