- 이 장에서는 분산 트랜잭션을 사용하는 것과 관련된 함정을 살펴봄
데이터베이스 트랜잭션
분산 트랜잭션 - 2단계 커밋
- 2단계 커밋(two-phase commit)알고리즘
- 2PC는 투표(voting) 단계와 커밋(commit) 단계로 나뉨
- 투표 단계에서 중앙 조정자(coordinator)는 트랜잭션에 참가할 모든 워커(worker)를 확인
- 두 가지 요청 존재
- 2단계 커밋과 관련된 많은 실패 모드가 존재함
- 워커가 많을 수록, 시스템 지연시간이 길수록 2단계 커밋에 더 많은 문제가 발생
분산 트랜잭션 - 그냥 안 된다고 하라
- 필자는 2단계 커밋 같은 분산 트랜잭션은 피해야한다고 강력히 제안함
- 대안은?
- 첫 번째 선택지는 데이터를 분리하지 않는것
- 두 번째 선택지는 사가
사가 패턴
- 2단계 커밋과 달리, 사가는 여러 상태 변경을 조정할 수 있지만 자원을 잠글 필요가 없는 알고리즘으로 설계됨
- 비즈니스 프로세스를 명시적으로 모델링할 수 있다는 추가적인 이점이 있음, 이는 상당한 혜택
- LLT(Long Lived Transaction)는 몇 분, 몇 시간 또는 며칠이 걸릴수 있는 장기 트랜잭션을 의미
- 단일 데이터베이스 트랜잭션이 LLT의 전체 수명주기에 걸쳐 진행됨
- 사가는 원래 단일 데이터베이스에 대해 작동하는 LLT를 지원하기 위한 메커니즘으로 구상됐음
- 그러나 여러 서비스에 걸친 변경 사항을 조정할 경우에도 효과적
사가 실패 모드
- 사가를 개별 트랜잭션으로 분해하면, 실패 처리 방법을 고려해둬야함
- 역방향 복구
- 순방향 복구
- 실패 발생 지점에서 데이터를 가져와 계속 처리
사가 패턴 구현
- 오케스트레이션형 사가(orchestrated saga)
- 코레오그래피형 사가(choreographed saga)
사가와 분산 트랜잭션 비교
요약