Spring Boot에서 Saga 패턴을 사용하는 방법은 무엇입니까?
따르다
사본
Spring Boot를 사용한 Saga 패턴 소개
마이크로서비스는 전체 애플리케이션 기능을 제공하기 위해 함께 작동하는 수많은 소규모 서비스로 구성된 분산 시스템입니다. [1]
이 아키텍처 스타일에는 많은 장점이 있지만 몇 가지 단점도 있습니다. 가장 큰 문제 중 하나는 수많은 서비스가 포함된 트랜잭션을 관리하는 방법을 결정하는 것입니다. [1]
분산 트랜잭션 시나리오에서는 트랜잭션이 수많은 서비스에 걸쳐 있지만 ACID(원자성, 일관성, 격리 및 내구성)를 유지하는 것은 항상 중요합니다. 두 번째 어려움은 트랜잭션 격리 수준을 제어하는 것입니다. 다른 서비스가 동시에 동일한 데이터에 액세스할 때 트랜잭션에 표시되는 데이터의 양을 결정합니다. [1]
2단계 커밋 프로토콜(2PC)
2PC는 분산 트랜잭션을 구현하는 데 널리 사용되는 방법입니다. 트랜잭션을 제어하고 트랜잭션 논리를 포함하는 코디네이터 구성 요소가 있습니다. 로컬 트랜잭션을 수행하는 참여 노드는 다른 구성 요소입니다. [1]
2PC 프로토콜의 단계[1]
두 단계가 있습니다. 1단계에서 코디네이터는 참여 노드에게 트랜잭션을 커밋할 준비가 되었는지 묻고 예 또는 아니요 응답을 기다립니다. 1단계에서 모든 노드가 '예'로 응답하면 코디네이터는 모든 노드에 커밋을 지시합니다. 그렇지 않으면 코디네이터는 모든 노드에 롤백을 지시합니다. [1]
2pc 프로토콜의 단점은 다음과 같습니다[1]:
- 코디네이터는 단일 실패 지점으로 이어질 수 있는 모든 서비스를 담당합니다. [1]
- 컨트롤러는 모든 서비스가 완료되는 시점을 결정하므로 작업의 전체 성능은 가장 느린 서비스에 바인딩됩니다. [1]
- NoSQL 데이터베이스는 2pc를 지원하지 않습니다. [1]
사가 아키텍처 패턴
Saga 아키텍처 패턴은 일련의 로컬 트랜잭션을 통해 트랜잭션을 관리합니다. 이전 단계를 성공적으로 완료한 후 Saga 패턴은 들어오는 요청으로 다음 단계를 트리거합니다. [1]
Saga 참가자의 작업은 로컬 트랜잭션으로 표현됩니다. Saga의 모든 작업은 보상 거래를 통해 되돌릴 수 있습니다. 보상 트랜잭션은 되돌릴 수 있고 멱등적이어야 합니다. [1]
Saga 실행 코디네이터
Saga 실행 코디네이터는 Saga 흐름을 실행하는 데 있어 핵심 구성 요소입니다. 여기에는 분산 트랜잭션의 이벤트 순서를 기록하는 Saga 로그가 포함되어 있습니다. [1]
오류가 발생하는 경우 SEC 구성 요소는 Saga 로그를 검사하여 영향을 받는 구성 요소와 보상 트랜잭션이 실행되어야 하는 순서를 결정합니다. [1]
SEC 구성 요소에 오류가 있는 경우 다시 시작할 때 Saga 로그를 읽을 수 있습니다. 그런 다음 성공적으로 롤백된 트랜잭션과 아직 보류 중인 트랜잭션을 확인하고 적절한 조치를 취할 수 있습니다. [1]
Saga 패턴은 안무와 오케스트레이션이라는 두 가지 방식으로 구현될 수 있습니다.
사가 오케스트레이션 패턴
마이크로서비스는 오케스트레이터나 지휘자에 의해 제어됩니다. 이를 통해 사가 또는 작업 흐름을 중앙 집중식으로 제어할 수 있습니다. 오케스트레이터 또는 지휘자는 모든 사가 또는 워크플로에 대해 중앙 집중화될 수 있거나 각 사가 또는 워크플로에 대한 개별 서비스로 배포될 수 있습니다. 이는 각 마이크로서비스에 다양한 수준의 독립성을 제공합니다.
Saga 오케스트레이션 패턴의 이점[2]:
- 분산된 트랜잭션 처리를 중앙 집중화합니다. [2]
- 설정 및 테스트가 간단합니다. [2]
- 간편한 롤백 관리. [2]
- 새로운 단계가 추가됨에 따라 프로세스는 안무 기술보다 덜 복잡해집니다. [2]
- 보류 중인 거래를 관리할 수 있습니다. [2]
Saga 오케스트레이션 패턴의 단점[2]:
- 추가 Saga Orchestrator 서비스를 관리하면 인프라의 복잡성이 커집니다. [2]
사가 안무 패턴
마이크로서비스는 독립적으로 작동하지만 신호나 이벤트를 사용하여 서로 조정됩니다. 사가 또는 작업흐름의 제어 방법은 미리 정의된 신호 또는 이벤트 세트에 의해 결정됩니다.
사가 안무 패턴의 장점은 다음과 같습니다 [2]:
- 이벤트를 트리거하는 서비스가 서로 다르기 때문에 이해하기 쉽고 기존 시스템에 설치할 수 있습니다. [2]
- 절차에 2~4단계가 있는 경우 매우 유용할 수 있습니다. [2]
사가 안무 패턴의 단점은 다음과 같습니다[2].
- 그러나 어떤 서비스가 어떤 이벤트를 수신하는지 추적하면 흐름이 더욱 복잡해짐에 따라 더욱 복잡해질 수 있습니다.[2]
- 서비스는 서로 구독해야 하므로 순환 종속성이 있을 수 있습니다. [2]
- 시스템을 철저하게 테스트하려면 모든 서비스가 작동해야 하므로 테스트가 어렵습니다. [2]
Axon Saga 프레임워크를 사용하여 Saga 패턴을 구현할 수 있습니다. Axon Saga 프레임워크는 Spring Boot 기반의 경량 Saga 패턴 프레임워크입니다. [1]
어떤 사가 패턴을 사용해야 할지 어떻게 결정하나요?
시스템 복잡성 : 오케스트레이션 패턴은 일관성을 유지하고 비즈니스 요구 사항을 준수하기 위해 제어 흐름을 중앙에서 제어해야 하는 복잡한 비즈니스 논리가 있는 시스템에 적합합니다. 반면에 구성 패턴은 서비스가 독립적으로 작동하고 이벤트 기반 통신을 통해 상호 작용할 수 있는 기본 비즈니스 로직을 갖춘 시스템에 더 적합합니다. [삼]
조정 요구 사항 : 오케스트레이션 패턴은 서비스 간의 긴밀한 조정과 상호 작용이 필요한 경우 유용합니다. 오케스트레이터는 통신을 처리하고 각 서비스가 다음 서비스로 이동하기 전에 해당 의무를 완료하도록 보장할 수 있기 때문입니다. 반면 안무 디자인은 각 서비스가 독립적으로 작동하고 필요에 따라 다른 서비스와 통신할 수 있는 느슨하게 연결된 시스템에 더 적합합니다. [삼]
내결함성 및 확장성 : 중앙 오케스트레이터가 오류 및 재시도를 처리하고 시스템 흐름을 개선할 수 있으므로 오케스트레이션 패턴의 내결함성과 확장성이 향상될 수 있습니다. 반면에 안무 패턴은 각 서비스가 중앙 구성 요소에 의존하지 않고 이벤트에 반응하고 동작을 업데이트할 수 있기 때문에 변화에 더 내구성이 있고 유연할 수 있습니다. [삼]
중앙 집중화 대 분산화 절충 : 오케스트레이션 패턴은 제어 및 의사 결정을 중앙 집중화하므로 시스템 개발 및 관리가 단순화되지만 단일 실패 지점과 병목 현상이 발생할 수 있습니다. 반면 안무 패턴은 권한과 의사 결정을 분산시켜 서비스 자율성과 유연성을 높이는 동시에 시스템을 더 복잡하고 운영하기 어렵게 만듭니다. [삼]
Spring Boot에서 안무 기반 Saga 패턴 구현
이벤트 소싱
애플리케이션 상태의 모든 변경 사항은 이벤트로 기록됩니다. 이 이벤트는 추적 목적으로 데이터베이스/이벤트 저장소에 저장되며 다른 당사자가 소비할 수 있도록 이벤트 버스에서도 브로드캐스트됩니다. [4]
새로운 주문을 하는 명령은 "order-service"에 의해 수신됩니다. 이 요청은 주문이 생성될 때 실행되고 이벤트로 발생합니다. OrderCreated 이벤트(이미 발생했기 때문에 과거 시제 사용)는 단순히 새로운 주문 요청이 수신되었고 PENDING/CREATED 상태에 있으며 아직 이행되지 않았음을 “order-service”에 알립니다. [4]
결제/재고 서비스는 이제 이러한 발생을 듣고 결제/재고를 예약/거부하는 데 관심이 있을 수 있습니다. 이것도 하나의 이벤트로 간주될 수 있습니다. 해당 이벤트에 대한 결제가 예약/거부되었습니다. 결제 예약/거절 이벤트 및 주문 서비스는 이러한 이벤트를 수신하고 최초 구매 요청을 이행/취소할 수 있습니다. [4]
안무 사가 패턴 프로젝트의 건축[4]
프로젝트의 소스 코드:
Spring Boot에서 오케스트레이션 기반 Saga 패턴 구현
오케스트레이터는 모든 마이크로서비스 간의 모든 트랜잭션을 조정하는 고유한 서비스입니다. 모든 것이 정상이면 "주문 요청"이 완료로 표시됩니다. 그렇지 않으면 취소된 것으로 표시됩니다. 이를 상태 비저장으로 만들기 위해 오케스트레이터와 다른 서비스 간의 통신은 비차단 비동기 방식으로 기본 HTTP를 통해 이루어집니다. 이 통신을 위해 Kafka 주제를 사용할 수도 있습니다. 이를 위해서는 상태 저장 스타일에 더 가까운 분산/수집 패턴을 사용해야 합니다 .[5]
오케스트레이션 사가 패턴 프로젝트 아키텍처[5]
프로젝트의 소스 코드:
Axon Framework를 사용하여 Spring Boot에서 오케스트레이션 기반 Saga 패턴 구현
이 구현에는 Axon Framework, Axon Server, SpringBoot 및 H2 데이터베이스가 사용됩니다. [6]
이 프로젝트에는 주문 서비스, 결제 서비스, 배송 서비스, 공통 서비스의 네 가지 서비스가 포함됩니다.[6]
주문 서비스는 시스템에서 주문 생성을 지원하는 API를 공개합니다. 이 서비스는 주문 집계도 관리합니다. 반면에 주문 서비스는 실제 주문 처리 사가 구현을 위한 홈 역할을 합니다.[6]
결제 서비스는 주문 처리 사가의 결제 완료 명령에 응답합니다. 작업이 완료되면 Saga를 발전시키는 이벤트를 게시합니다.[6]
배송 서비스는 Order Process Saga에서 발행한 주문 배송 명령 생성을 담당합니다. 작업을 수행한 후에는 Saga를 발전시키는 이벤트도 게시합니다.[6]
일반 서비스는 서비스 유형이 아닙니다. 이는 Saga를 구성하는 수많은 서비스 간의 통합 접착제 역할을 합니다. 여기에는 여러 서비스에서 활용되는 공통 명령과 이벤트가 포함되어 있습니다. [6]
Axon 서버는 Axon 플랫폼의 일부입니다. Axon Framework는 주문, 결제, 배송과 같은 집계를 관리하는 데 사용됩니다. [6]
Order Aggregate는 Saga Pattern 구현의 중요한 구성 요소입니다. 이는 Order Management Saga의 기반이 됩니다. Axon 관련 주석 @Aggregate 및 @AggregateIdentifier는 특히 주목할 만합니다. Axon Framework는 이러한 주석 덕분에 Order Aggregate 인스턴스를 관리할 수 있습니다. [6]
API 엔드포인트는 Order Controller 클래스에서 생성됩니다. 시연을 위해 현재로서는 끝점이 하나만 있습니다. 애플리케이션에서 새 주문이 생성되면 주문 생성 명령이 호출됩니다. Order Aggregate가 이 명령을 담당합니다. Order Event Handler 클래스는 다양한 소스의 이벤트를 처리합니다. 세부 정보를 데이터 멤버의 로컬 데이터베이스에 저장합니다. [6]
Order Management Saga는 Saga Pattern 구현의 핵심입니다. 어떤 의미에서 이것은 다양한 Saga 단계에 대한 다양한 핸들러를 설명하는 표준 Java 클래스입니다. 다양한 Saga 단계는 선언적으로 관리 가능합니다. 즉, 개발자가 Saga의 흐름을 한눈에 이해하는 것이 매우 간단합니다. [7]
이벤트는 Payment Aggregate 서비스에 의해 수신되고 처리됩니다. ShipmentAggregate는 이벤트 처리 및 수신 이벤트 처리를 담당합니다. [7]
코드 확인: [6][7]
참고자료
[1] Baeldung(2022년 11월 10일), Saga 패턴 마이크로서비스:
[ https://www.baeldung.com/cs/saga-pattern-microservices ]
[2] Şefik Can Kanber, (2021년 4월 12일), Saga 패턴 nedir?
[ https://sefikcankanber.medium.com/saga-pattern-nedir-e4a447bef361 ]
[3] Hemesh Thakkar, (2023), 마이크로서비스 오케스트레이션과 안무: 무엇을 선호합니까?
[ https://www.accionlabs.com/microservices-orchestration-vs-choreography-what-to-prefer ]
[4] Vinoth Selvaraj, (2020), 스프링 부트를 사용한 안무 사가 패턴:
[ https://www.vinsguru.com/choreography-saga-pattern-with-spring-boot/ ]
[5] Vinoth Selvaraj, (2020), Spring Boot를 사용한 오케스트레이션 사가 패턴:
[ https://www.vinsguru.com/orchestration-saga-pattern-with-spring-boot/ ]
[6] Knoldus(2022년 11월 14일), SpringBoot 3부와 함께 AxonFrameWork를 사용한 SAGA 구현:
[ https://blog.knoldus.com/saga-axonframework-springboot-1/ ]
[7]Knoldus(2022년 11월 18일), SpringBoot 2부와 함께 AxonFrameWork를 사용한 SAGA 구현:
[ https://blog.knoldus.com/blog-knoldus-com-saga-axonframework-springboot-2/ ]