세계적인 이커머스 플랫폼 쇼피파이(Shopify)가 재고 예약 시스템을 기존의 레디스(Redis)에서 MySQL로 성공적으로 전환했습니다. 이는 블랙프라이데이와 같은 극심한 트래픽 상황에서도 구매자가 상품을 결제하는 동안 재고를 정확히 보장하기 위한 핵심적인 변화입니다. 과거에는 레디스를 사용했지만, 재고 원장(inventory ledger)과 예약 시스템이 분리되어 데이터 일관성 문제와 운영 복잡성이 발생했습니다. 쇼피파이는 단일 데이터베이스 전략을 추구하며 MySQL로의 전환을 시도했고, 과거의 실패를 딛고 이번에 성공적인 결과를 얻었습니다.
이번 전환의 핵심은 MySQL 8의 'SKIP LOCKED' 기능과 '단위별 행(one row per unit)' 설계입니다. 기존에는 상품당 하나의 행에 수량을 기록했지만, 이는 동시성 문제를 일으켰습니다. 쇼피파이는 재고 단위 하나당 하나의 행을 할당하고, 예약을 할 때 여러 행을 동시에 선택하고 이동시키는 방식을 채택했습니다. 'SKIP LOCKED' 기능 덕분에 다른 트랜잭션이 특정 행을 잠그고 있어도 MySQL은 해당 행을 건너뛰고 다른 사용 가능한 행을 반환하여 대기 시간을 줄이고 동시성을 확보했습니다. 또한, 모든 재고 단위를 행으로 만들면 데이터베이스가 너무 커질 수 있으므로, 상품/위치 조합당 최대 1,000개의 행으로 예약 풀(bounded pool)을 제한하고, 재고 원장에서 이 풀을 지속적으로 채우는 방식으로 효율성을 높였습니다.
이러한 MySQL 기반 시스템으로의 전환은 쇼피파이가 직면했던 고질적인 문제를 해결했습니다. 레디스 기반 시스템에서는 결제 완료 후 재고 원장 업데이트와 레디스 예약 해제 과정이 단일 원자적(atomic) 트랜잭션으로 처리되지 않아, 재고 초과 판매(overselling)나 재고 손실(underselling)과 같은 치명적인 오류가 발생할 가능성이 있었습니다. 이제 재고 예약과 원장 관리가 동일한 MySQL 데이터베이스 내에서 ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션으로 묶이면서 이러한 오류 유형이 완전히 제거되었습니다. 이는 쇼피파이 플랫폼의 신뢰성을 크게 향상시키고, 판매자와 구매자 모두에게 더 안정적인 이커머스 경험을 제공하는 중요한 진전입니다.
