Saga Pattern
21 Oct 2024Saga 패턴에 대해서 알아보고 간단하게 구현해보자.
Saga 패턴이란?
Saga 패턴은 분산 시스템에서 연속된 서비스 호출이 하나의 트랜잭션처럼 동작되도록 설계된 패턴이다.
긴 트랜잭션을 여러 개의 작은 서비스로 나누어 처리하는 방식으로, 각각의 서비스가 독립적으로 트랜잭션을 수행하지만, 그 전체를 하나의 트랜잭션처럼 다루는 효과를 얻을 수 있다.
Saga 패턴의 특징
- 트랜잭션 분할 : 대규모 분산 시스템에서는 하나의 트랜잭션을 여러 서비스에 분배하여 처리하므로, 긴 트랜잭션을 분할하여 리소스나 네트워크를 효율적으로 관리할 수 있다.
- 각 서비스의 독립성 : 각 서비스가 개별적으로 관리되고, 하나의 서비스에서 실패가 발생하면 이를 보상하는 방식으로 처리된다.
- 보상 처리 : 트랜잭션이 실패했을 겨우, 이미 완료된 트랜잭션을 취소하기 위한 보상 처리 방법을 정의한다.
- 비동기 메시징 : 여러 서비스들이 비동기적으로 통신하며, 각 서비스 간의 의존성이나 트랜잭션을 유지하기 위해 메시징 시스템을 사용하는 경우가 많다.
Saga 패턴의 구현 방식
- Choreography: 각 서비스가 자신이 해야 할 일을 처리하고, 다음 서비스로 메시지를 보내는 방식
- Orchestration : 중앙 제어자가 각 서비스의 흐름을 관리한다.
이번 포스팅에선 Java, SpringBoot, Kafka를 이용하여 Choreography 방식 예시를 알아보자.
먼저 구현할 도메인은 order, stock, delivery 세 가지 도메인이다.
order 도메인에서 주문을 처리하면 stock 도메인에서 재고 처리가 되고, delivery 도메인에서 배달 처리가 된다.
다이어그램으로 살펴보면 다음과 같다.
실패할 경우는, delivery에서 실패가 일어났다고 가정한다.
delivery에서 실패하면 stock 도메인으로 실패 이벤트(rollback)를 전송하고 stock 도메인에서 실패 이벤트에 따른 DB 정보를 rollback 한다.
그리고 order 도메인으로 stock rollback 이벤트를 보내고 order 도메인에서도 실패 이벤트에 따른DB 정보를 rollback 한다.
다이어그램으로 살펴보면 다음과 같다.
직접 구현해보자.
먼저 이벤트 처리에 필요한 Kafka와 Zookeeper를 Docker 컨테이너 형태로 띄워보자.
각 이벤트에 맞는 토픽을 1:1로 만들어준다.
다음으로 각 도메인을 구현해보자.
카프카의 Producer Consumer 구조는 이렇다.
성공 OrderController -> OrderService -> StockConsumer -> StockService -> DeliveryConsumer
롤백 DeliveryService -> StockConsumer -> StockService -> OrderConsumer -> OrderService
성공 시 코드
delivery에서 확률적으로 에러가 발생
실패 시 코드