사진 Markus Spiske / Unsplash
창업·비즈니스

Shopify는 왜 재고 예약 시스템에서 Redis를 버리고 MySQL로 돌아갔나

편집 · 하루아이디어 편집팀 · 발행 2026년 8월 9일 · 출처: Shopify Engineering

Shopify가 재고 예약(inventory reservation) 시스템을 Redis+MySQL 이원 구조에서 MySQL 단일 구조로 바꿨습니다. 이유는 속도가 아니라 "과다판매를 막는 원자성 보장"이었습니다. 이커머스·재고 관리 서비스를 만드는 팀이라면 눈여겨볼 아키텍처 판단입니다.

무엇인가요

Shopify 엔지니어링 블로그가 재고 예약 시스템을 Redis에서 MySQL로 옮긴 과정을 공개했습니다. 기존에는 Redis(빠른 예약)와 MySQL(실제 청구)이 분리돼 있었는데, 두 단계 사이에 원자성이 보장되지 않아 과다판매(overselling) 위험이 있었다고 설명합니다. 같은 데이터베이스에서 ACID 트랜잭션으로 처리하도록 바꾸면서 이 위험을 구조적으로 없앴습니다.

기술적으로는 MySQL 8의 SKIP LOCKED 기능을 활용해, 기존에 “재고 10개 = 수량 컬럼 1행”이던 구조를 “재고 10개 = 10개 행”으로 바꿨습니다. 복합 기본키로 행당 락 개수를 줄이고, READ COMMITTED 격리 수준으로 갭 락을 방지했으며, 락 순서를 표준화해 교착 상태를 막았습니다. 흥미로운 발견은 실제 병목이 쿼리 성능이 아니었다는 점입니다. CPU 사용률은 낮은데 처리량이 한계에 부딪혔고, 원인을 추적해보니 다른 코드가 DB 커넥션을 필요 이상 오래 붙잡고 있었다고 밝혔습니다. 최적화 후 기본 DB 읽기는 50%, 트랜잭션은 33% 줄었고 플래시 세일 중에도 쓰기 CPU를 50% 미만으로 유지할 수 있었다고 합니다.

왜 주목할까요

국내 관점 코멘트

국내에서도 타임세일·선착순 할인·한정 수량 이벤트를 운영하는 커머스·티켓팅 서비스가 많은데, 이 구조에서 가장 흔히 겪는 사고가 바로 과다판매입니다. 트래픽이 몰릴 때만 재현되는 문제라 평소 테스트로는 잘 안 잡히고, 사고가 난 뒤에야 원인을 찾게 되는 경우가 많습니다.

당장 Shopify처럼 대규모 재설계를 할 필요는 없지만, 재고·예약·결제 단계 사이에 트랜잭션 경계가 명확히 있는지, 캐시(Redis)와 원장(DB)이 분리돼 있다면 그 사이 정합성을 어떻게 보장하는지는 지금 점검해볼 만합니다. 특히 다음 대형 프로모션 전에, 커넥션 풀 점유 시간처럼 눈에 잘 안 띄는 지표부터 한번 프로파일링해보는 것을 권합니다. Shopify 사례처럼 진짜 병목은 예상 밖의 곳에 있을 수 있습니다.

이 아이디어를 활용하려면

적합한 사람
개발자 · 1인 창업자
예상 난이도
주말 프로젝트
필요 예산
무료
검증 기간
1~2주
이번 주에 해볼 일
  • 우리 서비스의 재고·예약·결제 단계 사이에 원자성이 실제로 보장되는지 점검하기
  • MySQL 8의 SKIP LOCKED, READ COMMITTED 격리수준 문서 읽어보기
  • 트래픽 급증 구간에서 DB 커넥션을 오래 붙잡는 코드가 있는지 프로파일링하기

난이도·예산·기간은 편집장이 글을 근거로 추정한 값입니다.

원본 출처
Shopify Engineering ↗

이 글은 편집 담당이 원문을 직접 확인해 요약하고, 하루아이디어의 국내 관점 분석을 더한 재가공 콘텐츠입니다. 편집 기준과 수정·삭제 요청은 편집 원칙에서 확인하실 수 있습니다.