Open SeokRae opened 1 week ago
사가 패턴(Saga Pattern)
은 분산 시스템에서 데이터 일관성을 보장하기 위한 트랜잭션 관리 개념에서 나온 패턴입니다.
분산 시스템이나 마이크로서비스 아키텍처에서는 각 서비스가 독립적으로 트랜잭션을 처리하기 때문에, 한 번에 모든 서비스에서 하나의 트랜잭션을 처리하는 것이 어렵습니다.
이런 환경에서는 기존의 ACID 트랜잭션(원자성, 일관성, 격리성, 지속성)을 유지하는 것이 도전 과제가 됩니다.
사가 패턴은 이러한 분산 환경에서 데이터의 최종 일관성(Eventual Consistency)
을 보장하기 위해 등장한 개념입니다.
즉, 긴 트랜잭션을 여러 개의 작은 트랜잭션으로 나누어 처리하며, 각 트랜잭션이 실패할 경우 보상 트랜잭션을 통해 실패 이전의 상태로 데이터를 복원하여 전체 시스템의 일관성을 유지합니다.
전통적인 ACID 트랜잭션은 단일 데이터베이스 또는 단일 시스템에서 트랜잭션을 처리할 때 데이터의 일관성을 보장하지만, 분산 시스템이나 마이크로서비스 환경에서는 모든 시스템을 하나의 트랜잭션으로 묶기 어렵습니다. 분산된 시스템에서는 각 서비스가 서로 독립적이기 때문에 트랜잭션 처리가 복잡해지고, ACID 트랜잭션의 보장을 받기 어렵습니다.
분산 시스템에서 CAP 이론(Consistency, Availability, Partition Tolerance)
에 따라 일관성(Consistency)
을 완벽히 보장하면서도 가용성(Availability)
과 파티션 내성(Partition Tolerance)
을 모두 만족하기 어렵습니다.
즉, 네트워크가 분리되거나 장애가 발생했을 때 데이터 일관성을 유지하면서도 시스템이 계속 가용하게 동작하도록 하기 위해서는 최종 일관성(Eventual Consistency)
을 사용하는 방식이 필요하게 됩니다.
사가 패턴은 분산 시스템에서 즉시 일관성을 포기하고, 최종적으로 일관성을 보장하는 방식입니다. 즉, 시스템 내에서 여러 단계에 걸쳐 처리되는 트랜잭션이 완료된 후에 모든 시스템이 일관된 상태에 도달하도록 하는 것을 목표로 합니다.
사가 패턴에서는 한 번에 하나의 트랜잭션만 수행되며, 이 작은 트랜잭션들이 순차적으로 실행됩니다. 중간에 실패가 발생하면, 앞서 실행된 트랜잭션들을 되돌리기 위해 보상 트랜잭션이 실행됩니다.
하나의 긴 트랜잭션을 여러 개의 작은 트랜잭션으로 나누고, 이를 순차적으로 실행하여 트랜잭션이 성공적으로 완료되도록 합니다.
각 단계에서 실패가 발생했을 경우, 앞서 성공한 트랜잭션을 취소하거나 되돌리는 작업을 수행합니다. 이를 보상 트랜잭션이라고 합니다.
각 단계가 순차적으로 실행되며, 성공 또는 실패한 결과에 따라 전체 시스템이 최종적으로 일관된 상태에 도달하게 됩니다.
분산 시스템이나 마이크로서비스 아키텍처에서는 데이터 일관성을 유지하면서도 확장성과 유연성을 확보하는 것이 매우 중요합니다.
사가 패턴은 이러한 환경에서 데이터 일관성을 보장하고, 시스템의 장애나 오류에 대처할 수 있는 복구 메커니즘을 제공합니다.
비즈니스 프로세스에서 여러 단계를 거쳐 트랜잭션을 처리해야 하는 경우, 사가 패턴을 사용하면 각 단계의 트랜잭션을 나누고, 중간에 실패했을 때 안전하게 이전 단계로 되돌릴 수 있어 안정적이고 유연한 시스템을 구축할 수 있습니다.
사가 패턴은 분산 시스템에서 트랜잭션을 관리하고 데이터 일관성을 유지하기 위한 패턴입니다. 이 패턴은 ACID 트랜잭션이 분산 환경에서는 적합하지 않다는 점에서 발전되었으며, 작은 트랜잭션들을 나누어 처리하고, 보상 트랜잭션을 통해 데이터를 복원하여 최종 일관성을 보장하는 것이 핵심입니다.
References
모노리스에서 사가 패턴을 사용하는 이유
모노리스에서는 일반적으로 ACID 트랜잭션을 활용하여 데이터 일관성을 유지하지만, 복잡한 비즈니스 로직이나 다양한 모듈 간의 상호작용이 있을 때, 사가 패턴과 보상 트랜잭션을 도입할 수 있습니다.
복잡한 도메인 로직 관리
긴 트랜잭션 처리
비즈니스 일관성 vs 데이터 일관성
모노리스에서의 보상 트랜잭션
모노리스 시스템에서도 보상 트랜잭션을 사용해 데이터를 복원하는 방식은 여전히 적용 가능합니다.
예를 들어:
모노리스 시스템에서는 이런 보상 트랜잭션을 동일한 데이터베이스 내에서 처리하므로 분산 트랜잭션 관리보다는 상대적으로 쉬운 편입니다. 하지만 여전히 트랜잭션 실패나 예외 발생에 대비한 보상 로직이 필요할 수 있습니다.
모노리스에서 사가 패턴의 필요성
모노리스 vs 마이크로서비스에서의 차이
모노리스
: 모노리스 아키텍처에서는 트랜잭션 관리가 주로 단일 데이터베이스를 기반으로 이루어집니다. 대부분의 경우 ACID 트랜잭션으로 충분하며, 사가 패턴을 사용할 필요는 없습니다. 하지만, 비즈니스 로직이 복잡하거나 여러 모듈 간 트랜잭션 관리가 필요할 때 사가 패턴을 적용할 수 있습니다.마이크로서비스
: 분산된 데이터베이스 및 시스템 간의 분산 트랜잭션을 관리해야 하므로, 사가 패턴이 더 필수적입니다. 각 서비스가 독립적으로 트랜잭션을 관리하는 구조이기 때문에, 마이크로서비스에서는 보상 트랜잭션과 같은 방식으로 최종 일관성을 보장하는 것이 더 중요합니다.