RDBMS의 물리적 한계를 극복하기 위해 우리 프로젝트에서 재고 관리의 주도권을 디스크 기반의 RDBMS에서 인메모리 데이터 구조 저장소인 Redis로 옮기기로 결정했다. 하지만 Redis와 RDBMS 간의 데이터 불일치 구간이 발생할 수 밖에 없었다.
이 글에서는 Redis에서 발생한 재고 변동 사항을 RDBMS로 동기화하여 Eventual Consistency 를 달성하는 구체적인 아키텍처를 결정한다.
이전 글에서 검토한 Spring Event(Sold Out 시점 동기화)와 Spring Scheduler(주기적 동기화) 방식은 구현의 편의성은 높으나, 데이터 유실 가능성과 장애 복구 측면에서 치명적인 약점이 있었다.
따라서 Message Queue(MQ) 를 도입하여 Eventual Consistency를 달성하고자 한다.
먼저 Eventual Consistency 를 달성하기 위해 사용자 요청 처리의 '동기 구간'과 데이터 영속화의 '비동기 구간'을 명확히 분리해봤다.
내가 생각한 Eventual Consistency의 흐름은 다음과 같다.