-
[매일읽기] SAGA Pattern개발자 라이프/매일읽기 2020. 8. 27. 19:46반응형
원문 : https://medium.com/@omererakman/saga-pattern-2413e636ab16
문제 상황
- MSA에서는 각 서비스가 각자의 DB를 가지고 있음
- 단순한 하나의 요청이라도 여러 서비스를 경유하는 트랜잭션이 될 수 있음
- 이러한 트랜잭션 과정에서 ACID 원칙이 지켜져야 함
- 전통적인 해결 방법으로 Two Phase Commit(2PC) 방식이 있음
- NoSQL 에서 안됨
- 블록킹 프로토콜
사가(SAGA)란?
- 분산 트랜잭션 문제를 해결하기 위한 패턴
- 다중 데이터베이스들이 트랜잭션으로 묶이다보니 ACD만 지켜짐 (Isolation x)
- Isolation 이 지켜지지 않으니 트랜잭션 간에는 영향을 줄 수 있고, 그렇기 때문에 다음과 같은 방법으로 보완할 수 있음
- 상대적인 변경 : 특정 값으로의 변경이 아닌 증감을 통한 상대적인 변경
- 상태 유지 : 각 레코드 별로 상태 값(PENDING 등)을 가지게 함
- 버저닝 : 레코드들의 버전을 관리. (ex. 낙관적 잠금, optimistic locking)
- 기존 데이터베이스는 트랜잭션이 도중에 실패하면 롤백으로 처리할 수 있었지만, 사가는 보상 트랜잭션(compensating transaction)을 별도로 진행해야 함
- 레코드를 삽입하는 트랜잭션이 삽입 후 실패하게 되면, 해당 레코드를 삭제하는 별도의 보상 트랜잭션을 진행해야 함
사가 패턴 구현
코레오그래피(choreography) 방식 구현
- 서비스들이 서로에게 이벤트를 발행/구독하는 방식
- 서비스가 몇 개 없는 MSA에서는 간단히 구현할 수 있지만 시스템이 복잡해질수록 적합하지 않음
코디네이터(coordinator) 방식 구현
- 중앙에 이벤트 로직을 제어하는 코디네이터가 존재하는 방식
- 구현에는 어렵지만 트랜잭션의 상태들을 살피거나 디버깅하기에 용이함
반응형