카프카 - 사가 패턴
- 카테고리 없음
- 2025. 3. 10. 11:26
음 사가가 뭘까..
saga: 서비스들이 이벤트로 협력해서 트랜잭션을 완성하는 방식
Saga 패턴은 분산 시스템에서 트랜잭션을 처리하는 방법 중 하나로, 데이터베이스의 일관성을 보장하기 위해 여러 서비스 간의 복잡한 트랜잭션을 관리합니다. 이를 통해 마이크로서비스 환경에서 발생할 수 있는 트랜잭션 처리 문제를 해결할 수 있습니다.
요렇다고 한다.
그러면 주요 특징은 어떤것이 있을까
분산 트랜잭션 관리:
- 전통적인 분산 트랜잭션에서는 한 번에 모든 작업을 완료해야 하기 때문에, 여러 서비스가 참여할 때 데이터의 일관성을 유지하기가 어렵습니다.
- Saga 패턴은 각 서비스에서 로컬 트랜잭션을 처리하고, 각 로컬 트랜잭션의 성공이나 실패에 따라 후속 작업을 정의합니다. 즉, 트랜잭션을 여러 단계로 나누어 관리합니다.
그니까 사가 패턴은 보상 트랜잭션을 어떻게 사용하는지에 있는거 같다.
사가 패턴을 구현하는 방법에는 2가지가 있는데
Choreography (자율적)인 방법과 Orchestration (중앙 집중식)방법이 있다고 한다.
일단 그림을 봐보자.
요게 Choreography 방식이다.
지금 현재 그림에서는 order과 customer 두개의 도메인만 존재한다.
그렇다 Choreography 이 방식의 핵심은 도메인끼리 통신방법이라고 생각하면 된다.
카프카에는 제일 중요한 요소가 프로듀서랑 컨슈머 이렇게 2가지가 존재한다.
간략하게 말하면 프로듀서는 메시지를 발송하는 거구
컨슈머는 메시지를 받는것을 말한다.
결국 이 방식을 사용하려면 각각의 도메인마다 프로듀서와컨슈머가 둘다 존재해야 저 구조를 짤 수 가 있다.
예를 들어
- 주문 모듈:
- 주문 생성 이벤트 (OrderCreated)를 발행.
- 이 이벤트는 배송 모듈과 결제 모듈에서 처리될 수 있어요.
- 결제 모듈:
- 주문 생성 이벤트 (OrderCreated)를 컨슈머로 수신하고, 결제 진행 후 결제 완료 이벤트 (PaymentCompleted)를 발행.
- 배송 모듈:
- 결제 완료 이벤트 (PaymentCompleted)를 컨슈머로 수신하고 배송을 시작 후, 배송 시작 이벤트 (ShippingStarted)를 발행.
요렇다고 가정해보자. 그러면 주문을 생성하고 결제하고 배송을 하게 되어진다.
그러면 주문쪽에서 메시지를 발송하면 결제쪽에서 메시지를 수신할거고 결제가 시작이 되었다고 메시지를 발송할 거다..
이런식으로 생각하면 주문쪽에 프로듀서가 결제쪽에는 프로듀서,컨슈머 두개가 반드시 필요하게 된다.
그래서 이 방식을 사용하려면 도메인마다 프로듀서가 컨슈머가 적절히 구분되어야 된다.
물론 구현에 따라 어떤 도메인에는 프로듀서만 또 어떤 도메인에는 컨슈머만 있을 수 있다. 하지만 그게 중요한게 아니고
Choreography이 방식의 핵심적인 특징은 도메인끼리 메시지를 주고 받는다는 점이다.
도메인끼리 메시지를 주고 받으니까 느슨한 결합이 될 수 있겠지만 카프카의 토픽을 읽어야 지금 어떤 상태인지 정확하게 알 수가 있다는 된다는 점에서 비교적 디버깅이 어렵다는 단점을 가지고 있다.
요렇게 순서를 정하고 보상 트랜잭션까지 설정하면 된다.
그 다음은
Orchestration (중앙 집중식)이다. 요것도 일단 그림을 봐보자.
그림에서도 알수 있듯이 하나의 거대한 모듈이 처리한다는 걸 알 수 있다.
즉 메시지 발송은 여러곳에서 하지만 메시지 수신은 한곳에서 한다는 점이 다르다는것에 있다.
이것에 대한 특징은 중앙에서 메시지를 관리한다는점에 있다고 생각한다.
내가 생각할떄는 각 도메인에서 메시지를 발송하고 중앙 도메인에서 메시지를 수신해서 처리하는 점이라는거다.
즉 결합도는 위 방식보다는 높아지지만 디버깅이 높다는 점에 있다.
내가 생각할때 이 방식은 한곳에서 모든것을 처리해주는 시스템이라 생각한다. 지금 그림에서는 주문쪽이 이것을 선택한 느낌이다.
https://devyonghee.github.io/theory/2022/09/24/orchestration-vs-choreography/
[마이크로서비스] Saga Pattern 자세히 알아보기 (feat. orchestration, choreography)
devyonghee.github.io