관리 메뉴

피터의 개발이야기

[MSA] 마이크로서비스 - 분산 트랜잭션 처리를 위한 Saga 패턴 본문

Kubernetes/기초공부

[MSA] 마이크로서비스 - 분산 트랜잭션 처리를 위한 Saga 패턴

기록하는 백앤드개발자 2024. 2. 27. 11:13
반응형

ㅁ 들어가며

ㅇ 예전 글인 [MSA] 12가지 마이크로서비스 패턴에서 Saga 패턴에 대해서 간략히 이야기 하였다. 

   ㄴ 여러 마이크로서비스에서 분산 트랜잭션을 관리하여 서비스의 자율성을 유지하면서 데이터 일관성을 보장한다.

ㅇ Saga 패턴에 대해 구체적으로 정리해 보았다.

 

ㅁ 데이터베이스와 마이크로서비스의 딜레마

데이터베이스와 마이크로서비스는 일관성과 분리 격리성이라는 구조적 딜레마를 내포하고 있다.

 

데이터베이스

 - 원자성: 모두 발생하거나 발생하지 않아야 하는 불가역적이고 돌이킬 수 없는 작업 세트

 - 일관성: 같은 시간에 조회하는 데이터는 항상 동일한 데이터임을 보증

 

마이크로서비스

 - 격리성: 서비스 단위를 분리를 통한 장애 분리 및 보안성 강화

 

 이전에 이러한 딜레마를 손쉽게 처리할 수 있는 방법 중 하나는

  여러 개의 분산된 서비스를 하나의 일관된 트랜잭션으로 묶는 2PC방법이 있다.

 

ㅁ 2PC(Two-Phase Commit)🔗

 

 

2PC(Two-Phase Commit)는 트랜잭션을 커밋할지 중단 (롤백)할지 여부에 대해 분산 트랜잭션에 참여하는 모든 프로세스를 조정하는 분산 알고리즘이다. 기본적으로 2PC는 여러 데이터베이스 노드에 쓰기를 순차적으로 처리하기 위해 2가지 phase로 진행한다.

 

 - write data: 각 노드에 write

 - phase 1: 각 노드에 prepare 요청을 보내 commit 확인 

 - phase 2: 각 노드에 commit

 

2PC는 코디네이터가 각 노드에 번복 없이 모두가 yes를 응답했을 때에 반드시 커밋하여 원자성을 보장하고 있다.

 

 

2PC의 장애 대응 약점

2PC도 네트워크 실패나 코디네이터의 셧다운, 노드의 장애로 인해 트랜젝션을 롤백하는 과정에 공백이 발생할 수 있다. 

코디네이터가 셧다운 되면, 다른 노드들은 자기 스스로 롤백을 할 수 없고, 노드가 장애가 되면 코디네이터는 회복을 기다렸다가 타임아웃처리하는 방법 뿐이다. 

 

 

MSA와 충돌

 - 다중 노드에 대해서 동기화되면서 성능 이슈 발생.

 - 코디네티어터는 결국 하나의 DBMS를 사용한다.

 - 코디네이터에 의존적, 장애 분리 원칙에 위배됨.

 - NoSQL 및 메시지 브로커와 같은 경우 이 모델을 지원하지 않음.

 

ㅁ Saga Pattern이란? 🔗

  Saga Pattern은 분산 트랜잭션에서 마이크로 서비스 간의 데이터 일관성을 관리하는 방법이다. Saga는 각 서비스를 업데이트하고 메시지 또는 이벤트를 게시하여 다음 트랜잭션 단계를 트리거하는 일련의 트랜잭션이다. 단계가 실패하면 Saga는 이전 트랜잭션을 상쇄하는 보상 트랜잭션을 실행한다.

 

보상 트랜잭션이란?

 Saga Pattern는 변경 사항이 이미 커밋되었기 때문에 이전 단계에서 변경한 내용을 자동으로 취소할 수 없다. 대신 해당 변경 사항을 명시적으로 취소하는 보상 트랜잭션을 작성해야 한다. 실패할 수 있는 각 단계에 해당하는 보상 트랜잭션이 있어야 한다.

 Saga Pattern의 2가지 방식이 있다.

 - Ochestration 방식: Invoke/Reply 방식의 중앙 집중형 방식

 - Choreography 방식: Event Driven으로 비동기 처리하는 서비스 주도형 방식

 

ㅁ Orchestration 방식 🔗

오케스트라 지휘자가 단원들을 지휘하듯, 중앙 프로세스가 다른 서비스를 구동한다. 

 

 

Orchestration중앙 집중식 컨트롤러가 Saga 서비스에게 실행할 로컬 트랜잭션을 알려주는 방식이다. Orchestration은 모든 트랜잭션을 처리하고 이벤트에 따라 수행할 작업을 참가자에게 알려준다. 오케스트레이터는 Saga 요청을 실행하고, 각 작업의 상태를 저장 및 해석하며, 보상 트랜잭션을 사용하여 오류 복구를 처리한다.

 

이점 

  서비스가 확장 시 복잡한 워크플로워에 적합하다. 특히 각 서비스의 도메인이 긴밀하게 연관되어 있는 경우 복잡한 비지니스 로직을 중앙에 집중하고 개별 서비스를 단순화하여 중복되는 코드를 경량화 할 수 있다. Saga의 다른 참가자들은 서로의 명령에 대해서 알 필요가 없다. 

 

단점

 - Orchestration이 전체 플로워를 관장하기 때문에 개별 서비스가 스스로 처리할 수 없는 장애포인트가 발생함.

 - 중앙 집중으로 인해 개별에 대해서는 간편해졌지만, 복잡성이 과중되어 오버해드가 발생할 여지가 있음. (나중에 쪼개기 어려움)

 

ㅁ Choreography 방식 🔗

 

Choreography는 발레 무용수들이 자신의 역할을 알고 주변의 다른 무용수와 반응하여 협업하는 방식과 유사하다.

 

 Choreography 방식은 참가자가 중앙 집중식 제어 지점 없이 이벤트를 교환하여 조정하는 방법이다. 각 로컬 트랜잭션은 Choreography을 사용하여 다른 서비스에서 로컬 트랜잭션을 트리거하는 도메인 이벤트를 게시한다.

 

ㅇ 이점
 - 참가자가 거의 없고 조정 로직이 필요하지 않은 간단한 워크플로에 적합하다.
 - 추가 서비스 구현 및 유지 관리가 필요하지 않다.
 - 책임은 Saga 참가자에게 분산되므로 단일 실패 지점을 도입하지 않는다.

 

ㅇ 단점
 - 어떤 Saga 참가자가 어떤 명령을 수신 대기하는지 추적하기 어려워 오버플로워가 발생할 수 있다.
 - 서로의 명령을 소비해야 하기 때문에 Saga 참가자 간에 순환 종속성이 발생할 위험이 있다.
 - 트랜잭션을 시뮬레이션하기 위해 모든 서비스를 실행해야 하므로 통합 테스트는 어렵다.

 

ㅁ 고민이 필요한 Saga Patten

 데이터의 일관성과 마이크로서비스의 격리성을 접하며, Saga 패턴을 바라보는 새로운 사고 방식이 필요하다. Saga 패턴은 특히 디버깅이 어렵고 다른 참가자가 많아질 수록 복잡도가 증가한다. 단위 RDMS에서 한번에 트랜젝션처리를 했던 로직이 분산하면서 부수적으로 보상 트렌젝션이나 단위 노드로 전달하는 방식에 따른 추가적인 설계가 필요하다. 통계를 내면, join 쿼리 한번에 끝날 일을 때로는 다른 도메인간의 맴핑 정보를 서로 동기화 해야하고, 추가 세부적인 정보를 API를 통해서 받게 되면, 단일 디비보다 10배는 더 느려질 수도 있다. 네트워크 IO가 병목접이기  때문이다.

  구현 시점에 잠재적인 오류를 대처하여 데이터 일관성을 보장하기 위한 멱등성을 제공해야 한다. 메시지 기반 비동기 처리 시에는 프로세스의 역전이 발생하여 프로세스의 경합이 발생하기도 한다. 일부 네트워크 지연이나 디비 지연등으로 인해 비동기로 순서가 보장되야 할 데이터가 역전이 발생하는 상황이다. 

 

ㅁ 마무리

 데이터베이스(일원성)과 마이크로서비스(격리성)을 딜레마를 설명하고, 예전 방식인 2PC의 원리와 단점에 대해서 알아보았다. Saga 패턴은 2PC의 단점을 보안하기 위해 발전되었지만, 상황에 따라 같은 딜레마에 빠질 수 있었다. Saga 패턴은 이를 해결하기 위해 결과적 일관성(eventual consistency)을 제시한다. 개별 서비스는 로컬 트랜잭션을 수행하고 실패 시 보상 트랜잭션을 실행한다.

 개인적인 생각으로는 Choreography 방식이 MSA에 적합하여 전반적으로 더 느슨한 결합으로 유연하게 변경을 보다 쉽게 수용할 수 있다고 생각한다.  결과적 일관성... 이를 위해서는 다양한 위험사항에서 보상 트랜잭션을 고려해야 하고, 프로세스를 모니터링하고 추적하는 부가 작업이 수반된다. 오케스트레이션 방식이 중앙 집중식이라 전체 시스템의 장애 전파에 취약하고, 중앙 집약적이라 변경 시 독이 될 수도 있게 된다. 각 서비스의 특생에 맞추어 적절한 방식을 선택해야 한다. 

 

 

마지막으로 정리하면서 다시 드는 생각인데, 마이크로서비스는 분명 고가용성을 위한 아키텍처이지만, 정말 효율적인 방식은 아니다.

 

마이크로서비스는 정말 어쩔 수 없어서 쓰는 것이지, 편안해서 쓰는게 절대 아니다.

 

 오리가 생각났다.

 마이크로서비스결과적으로 안정된 서비스를 위해 더 많은 고군분투가 필요하다.

이것이 마이크로서비스이다.

 

ㅁ 함께 보면 좋은 사이트

SDS - MSA 환경에서 데이터 관리를 위한 필수사항 - 고가용성과 데이터 동기화

microsoft - Saga 분산 트랜잭션 패턴

velog - 마이크로서비스 - 분산 트랜잭션 처리 패턴

오케스트레이션orchestration과-코레오그래피-choreography

Two Phase commit 이란?

반응형
Comments