[MSA] 분산 트랜잭션(Two-phase commit (2pc))과 사가 패턴(Saga Pattern)
마이크로서비스별로 기능을 분리하고 저장소를 격리함에 따라 이전에는 불거지지 않았던 문제가 생깁니다. 즉, 여러개의 분산된 서비스에 걸쳐 비즈니스 처리를 수행해야 하는 경우 비즈니스 정합성 및 데이터 일관성을 어떻게 보장할 것인지에 관한 문제입니다.
손쉽게 적용할 수 있는 한 가지 방법은 여러 개의 분산된 서비스를 하나의 일관된 트랜잭션으로 묶는 것 입니다. 이것을 분산 트랜잭션 처리 패턴 이라고 합니다.
분산 트랜잭션 처리 패턴
2단계 커밋 방법
2단계 커밋 방법은 분산 데이터베이스 환경에서 원자성을 보장하기 위해 트랜잭션에 포함돼 있는 노드가 커밋되거나 롤백 하는 메커니즘입니다.
그런데 이 방법은 각 서비스에 잠금이 걸력 발생하는 성능 문제 탓에 효율적인 방법이 아닙니다. 특히 각 서비스가 다른 인스턴스로 로딩되기 때문에 통제하기 어렵습니다. 또한 서비스의 저장소가 각각 다를 경우 문제가 있으며, 특히 MongoDB 같은 NoSQL 저장소는 2단계 커밋 자체를 지원하지 않습니다.
특히 클라우드의 가장 큰 장애는 네트워크 장애인 경우가 많은데 네트워크 장애 등으로 특정 서비스의 트랜잭션이 처리되지 않을 경우 트랜잭션에 묶인 서비스가 즉시 영향을 받기도 합니다. 2단계 커밋을 통한 트랜잭션 처리는 독립적이지 않고 비자율적입니다.
사가 패턴(Saga Pattern)
마이크로서비스의 독립적인 분산 트랜잭션 처리를 지원하는 패턴이 바로 사가패턴입니다.
사가 패턴은 각 서비스의 로컬 트랜잭션을 순차적으로 처리하는 패턴입니다. 사가 패턴은 여러 개의 분산된 서비스를 하나의 트랜잭션으로 묶지 않고 각 로컬 트랜잭션과 보상 트랜잭션을 이용해 비즈니스 및 데이터의 정합성을 맞춥니다. 각 로컬 트랜잭션은 자신의 데이터베이스를 업데이트한 다음, 사가 내에 있는 다음 로컬 트랜잭션을 트리거하는 메시지 또는 이벤트를 게시해서 데이터의 일관성을 맞춥니다.
.. 작성중