카테고리 없음

[설계 면접] 동시에 두 명이 같은 좌석을 예매하려고 시도했을 때 어떻게 처리하나요?

공부하고 기억하는 공간 2025. 5. 27. 22:01
728x90
반응형
SMALL

예매 시스템에서 하나의 좌석을 두 명 이상이 동시에 요청하는 경우, 선착순으로 하나의 요청만 성공해야 하는 문제가 있었습니다.초기에 Redisson Lock을 사용해 동시성 제어를 구현했지만, 부하 테스트 결과 lock 경합에 따른 응답 지연이 심해지는 문제가 발생했습니다.이를 해결하기 위해 Redis LuaScript를 사용해 선점 가능한지 검사 → 선점 상태 등록까지의 작업을 원자적으로 수행하도록 했습니다.

예: SETNX seat:123 reservedUserId EX 600 같은 방식으로 10분 간 예약된 상태를 유지하며, 실패 시에는 즉시 실패 응답을 주도록 구현했습니다.결과적으로 동시에 요청이 들어와도 한 명만 선점할 수 있도록 정합성을 보장하면서, 성능도 개선되었습니다.

 

 

꼬리 질문

1.만약 Redis가 장애 난다면 어떻게 정합성을 유지하나요?

Redis는 성능과 원자성을 위해 사용되지만, 단일 장애점이 되지 않도록 Sentinel 또는 Cluster 구성으로 고가용성을 확보했습니다.그럼에도 불구하고 장애가 발생한 경우를 대비해, 좌석 예약 요청은 Kafka로 비동기 처리되며, Redis 선점 실패 시에는 좌석 정보를 DB에 직접 접근하여 선점 가능 여부를 재검사하도록 fallback 로직을 마련했습니다. 이때 병목 방지를 위해 DB에서 선점 여부를 체크할 때는 seat_instance 테이블의 status 필드에 대해 Optimistic Lock (version 기반)을 사용하거나, UNIQUE 제약 조건을 활용하여 중복 선점을 방지했습니다.

728x90
반응형
SMALL