개발자 블로그
Harmony 서비스 팀의 CQRS 도입 사례: Deadlock 문제 해결과 데이터 정합성 개선 본문
이번 포스팅에서는 Harmony 서비스 상품 팀이 대규모 트래픽과 복잡한 데이터 처리를 효율적으로 관리하기 위해 CQRS(Command Query Responsibility Segregation)를 도입하고, 배포 시 발생했던 Deadlock 문제를 어떻게 해결했는지 소개하려 합니다.
문제 상황: Materialized View Refresh로 인한 Deadlock과 데이터 정합성 이슈
초기에는 조회 성능을 개선하기 위해 Materialized View를 도입해 데이터를 조회했습니다. 하지만 배포 시, Materialized View를 Refresh하는 배치 작업과 마이그레이션 트랜잭션이 맞물리면서 Deadlock이 발생했습니다. 이러한 Deadlock은 배포를 지연시키고, Refresh 주기를 1분으로 설정해도 그 시간 동안 데이터 정합성이 유지되지 않는 문제가 있었습니다.
CQRS 개념 소개
이 문제를 해결하기 위해 Harmony 팀은 CQRS 패턴을 도입했습니다. CQRS는 명령(쓰기)과 조회(읽기)의 책임을 분리하여 성능과 확장성을 높이는 아키텍처 패턴입니다. 이를 통해 읽기 모델은 빠르게 조회 작업을 처리하고, 쓰기 모델은 복잡한 비즈니스 로직을 안전하게 수행할 수 있습니다. 이러한 구조는 트랜잭션으로 인한 Deadlock을 방지하고, 비동기적 데이터 처리를 통해 데이터 정합성을 유지하는 데 매우 효과적입니다.
이벤트 드리븐 아키텍처 적용
CQRS 도입과 함께 Harmony 팀은 이벤트 드리븐(Event-Driven) 아키텍처를 결합하여 시스템 성능을 더욱 강화했습니다. 모든 데이터 변경 사항(쓰기 명령)은 이벤트로 발행되며, 읽기 모델은 이 이벤트에 따라 실시간으로 업데이트됩니다. 이를 통해 더 이상 Materialized View Refresh 주기로 인한 데이터 정합성 문제는 발생하지 않았습니다.
Saga 패턴을 통한 마이크로서비스 트랜잭션 관리
마이크로서비스 아키텍처에서 독립적으로 동작하는 각 서비스는 분산된 구조로 인해 트랜잭션 일관성을 유지하는 데 어려움을 겪을 수 있습니다. Harmony 팀은 이러한 문제를 해결하기 위해 Saga 패턴을 도입했습니다. Saga 패턴의 주요 개념은 다음과 같습니다.
- 로컬 트랜잭션 시퀀스: 전체 트랜잭션을 작은 로컬 트랜잭션으로 분할하여 각 서비스가 독립적으로 트랜잭션을 관리합니다.
- 보상 트랜잭션: 각 로컬 트랜잭션이 실패할 경우 이전 단계의 작업을 취소하기 위해 보상 트랜잭션을 실행하여 시스템의 일관성을 유지합니다.
- 이벤트 기반 통신: 서비스 간 통신은 이벤트를 통해 이루어지며, 트랜잭션의 각 단계에서 상태를 이벤트로 발행하여 다음 단계로 작업을 이어가거나 실패 시 보상 작업을 수행할 수 있도록 합니다.
CQRS 및 이벤트 드리븐 아키텍처와의 결합으로 개선된 성능
이번 프로젝트에서 Harmony 팀은 CQRS와 이벤트 드리븐 아키텍처를 함께 도입하여 Deadlock 문제와 데이터 정합성 문제를 해결했습니다. 각 데이터 변경 사항이 이벤트로 발행되고, 조회 모델이 이를 기반으로 실시간으로 업데이트됨으로써 더 이상 Materialized View Refresh 주기에 의존할 필요가 없었습니다.
이 접근 방식을 통해:
- Deadlock 문제를 완전히 해결하고,
- 데이터 정합성을 대폭 개선할 수 있었습니다.
이제 Harmony 서비스는 배포 시 데이터 갱신 지연 없이, 안정적으로 시스템을 운영할 수 있게 되었습니다.
'잡담' 카테고리의 다른 글
pipenv로 의존성 관리 개선하기: requirements.txt에서의 전환 경험 (0) | 2024.10.02 |
---|---|
Onechain 거래소: pre-commit으로 코드 포매팅 자동화 (0) | 2024.09.22 |
대용량 데이터 엑셀 다운로드 최적화: 이커머스 서비스 백오피스 사례 (0) | 2024.09.22 |
라이드 플럭스(추가 서류) (0) | 2022.07.26 |
작당모의 - 사전 과제 (0) | 2022.07.06 |