성능 최적화를 위한 배치 및 캐시 전략 - Genie-Uss/genieus GitHub Wiki
선착순 쿠폰 발급
- 대규모 트래픽 환경에서는 쿠폰 발급 시 다수의 동시 요청으로 인해 DB에 과도한 Insert 트랜잭션 충돌이 발생할 수 있습니다.
- 이를 방지하기 위해 Batch Insert 방식을 채택하여, 대량의 Insert 작업을 묶어서 한 번에 처리함으로써 DB 락 경합을 최소화하고 처리 성능을 향상시켰습니다.
- 또한, 발급 스케줄링과 안정적인 실행 관리를 위해 Jenkins와 Spring Batch를 연동하여, 정기적 자동 실행 및 실패 복구 기능을 제공하는 체계를 구축했습니다.
재고 예약 처리
- 재고 예약 과정에서는 다수의 동시 요청으로 인해 재고 차감 연산의 원자성(Atomicity) 보장이 필수적입니다.
- 이를 위해 Redis + Lua Script를 활용하여, 하나의 Lua 스크립트 안에서 재고 확인과 차감 연산을 일괄적으로 수행함으로써 분산 락 없이도 데이터 정합성을 확보했습니다.
- 추가로 Redis의 빠른 응답 속도를 활용하여, 밀리초(ms) 단위의 응답 처리가 가능하도록 최적화했습니다.
RDB 재고히스토리 저장
- 재고 데이터는 실시간 변경이 아닌, 특정 이벤트(주문 완료, 취소) 후 일괄 저장하는 구조입니다.
- 이에 따라, 재고를 저장할 때 개별 Insert 대신 Batch Insert를 적용하여 DB 커넥션 수를 줄이고 I/O 비용을 감소시켜 대량 데이터 처리 성능을 높였습니다.
- 특히 재고 갱신 트래픽이 집중될 경우에도 DB 락 경합을 완화할 수 있도록 설계했습니다.
주문 만료 처리
- 만료된 주문은 한꺼번에 대량으로 업데이트가 필요합니다.
- 개별 Update 처리 시 발생할 수 있는 Row Lock 경합과 트랜잭션 부하를 줄이기 위해 Batch Update 방식을 도입했습니다.
- 이를 통해 다수의 주문 상태를 한 번의 트랜잭션으로 처리함으로써, DB 락 유지 시간을 단축하고 시스템 자원을 효율적으로 사용할 수 있었습니다.