MicroService Architecture ‐ TCC - thought-corner/Backend-PlayGround GitHub Wiki
MicroService Architecture ‐ TCC
- TCC(Try-Confirm-Cancel)는 분산 시스템에서 데이터 정합성을 보장하기 위해 사용하는 분산 트랜잭션 처리 방식이다.
- 다음과 같이 3단계로 나누어 트랜잭션을 관리한다.
- Try : 필요한 리소스를 점유할 수 있는지 검사하고 임시로 예약한다.
- Confirm : 실제 리소스를 확정 처리해 반영한다.
- Cancel : 문제가 발생한 경우 예약 상태를 취소하여 원복한다.
- Try, Confirm, Cancel 단계는 멱등하게 설계가 되어야 한다.
TCC의 장·단점
- 확장성과 성능에 유리하다. 2PC에 비해 데이터베이스 Lock 점유 시간이 짧고 Long Transaction에 덜 취약하다.
- 장애 복구와 재시도 처리에 유연해서 비즈니스 정책에 따라 전략을 정할 수 있다.
- 기존 시스템에 비해 설계와 구현이 복잡하다. 모든 단계 자체가 멱등하게 설계되어야 하며 네트워크 오류, 재시도 시나리오를 고려한 복잡한 로직 구현이 필요하다.
1. Try(예약)
- 실제 확정이 아니라 "임시 점유"가 핵심이다.
- 재고 100을 바로 차감하는 것이 아니라 가용재고 98 / 예약 2와 같이 예약 상태로 따로 잡아둔다.
- 포인트라면 바로 차감이 아니라 동결. 이렇게 모든 변경을 되돌릴 수 있는 중간 상태로 만들어 두는 게 Try의 역할이다.
- 만약 여기서 중간 상태로 전환할 자원이 부족하면 실패한다.
2. Confirm(확정)
- 모든 서비스의 Try가 성공했을 때만 호출된다. Try에서 잡아둔 예약을 실제로 반영한다.
- 예약 재고를 진짜 차감시키고 포인트 동결을 진짜 차감시킨다.
- 여기서 중요한 부분은 Confirm은 실패하면 안 된다. 이미 Try에서 자원을 확보했기에 실패하면 무한 재시도로 끝까지 성공시키는게 원칙이다.
3. Cancel(보상, 원복)
- Try 중 하나라도 실패하면 이미 성공한 Try들을 되돌린다.
- 예약 재고를 가용으로 다시 반환하고 동결한 포인트를 다시 해제한다.
왜 멱등(Idempotent)이 필수인지?
- 분산 환경에서 네트워크 타임아웃 때문에 Confirm/Cancel이 중복 호출되거나 응답을 못 받아서 재시도되는 일이 항상 있다고 생각해야 한다.
- Confirm이 2번 와도 한 번만 차감해야 하고, Cancel이 2번 와도 한 번만 원복해야 한다.
- 그래서 각 단계는 이미 처리했으면 무시하도록 멱등하게 짜야한다.