📌 고민사항
이전에 재고의 동시성 문제를 해결하기 위하여 synchronized를 활용하여 재고수량 변경 부분에 락킹 처리를 해주었다.
그리고 단일서버 synchronized의 임계영역을 최소화 하기위해서 상품 판매 오픈전에 미리 특정상품 A에 해당하는 재고 수량정보를 로컬서버에 캐싱해 온 후 수량정보를 변경하는 방식을 생각했었다.
이러한 상황에서 아래와 같이 크게 3가지 고민사항이 생겼다.
1. 캐싱을 한다면 로컬 서버(메모리)에 캐싱할 것인가? 아니면 redis와 같은 global캐시를 활용할 것인가?
2. 상품 판매 오픈전 캐싱해올 때 어떤방식으로 캐싱해 올 것인가?(판매자의 수동처리 or 배치처리)
3. 캐시의 경우 서버가 다운되는 순간 날아가 버리고, 재고수량 관리에 문제가 생길 것이다. 이러한 경우 어떻게 처리할 것인가?
📌 redis를 사용해보자
현재 단일 서버 환경에서 synchronized를 활용하기 때문에 Database의 데이터를 메모리상에 로드할 수 있다.
그런데! 메모리에 로드해 온 재고 정보가 있을 때 서버가 다운된다면 수정 중이던 재고정보는 날아가 버릴 수 있다.
이를 방지하기 위하여 서버의 개수를 늘려서 서버 장애가 발생했을 때 대비할 수 있을 것이라고 생각한다.
그러나 서버의 개수를 늘릴 경우 synchronized가 아닌 다른 동기화 기법을 생각해봐야 하고, 메모리의 캐싱내역 또한 서버 간에 공유하기 어려워지기 때문에 현재 상황에서 redis와 같은 global캐시를 활용해 보는 것이 괜찮을 것이라고 생각하였다.
redis 사용 시 주의해야 할 고민사항
상품재고서버가 다운되더라도 재고 수량 정보는 redis에 보관되기 때문에 문제가 없을 것이라고 생각한다.
그러나 redis도 하나의 캐시 컴퓨터이고 장애가 발생할 수 있기 때문에 redis에 장애가 발생할 경우 재고 수량정보를 어떻게 복구해야 할지 고민해봐야 한다.
1. redis 장애 발생 시 상품 재고 서버의 애플리케이션에서 어떻게 반응해야 하는가?
2. redis 장애 발생 시 날아가버린 상품 재고 정보를 어떻게 처리해야 하는가?
📌 redis장애가 발생했을 때 어떻게 처리해 줄까?
먼저 redis에 장애가 발생했을 경우에, 애플리케이션 로직에서 redis 에러 핸들링을 해야 한다고 생각하였다.
주문하거나 주문이 취소되는 경우에 재고 수량이 변경될 것이다. 이때 redis에러가 발생한다면 주문이 실패하거나, 주문 취소가 실패하도록 유도해야 한다.
그리고 현재 재고수량 정보를 redis에서 관리하고 있기 때문에, 만약 redis서버가 다운되어 버린다면 캐시특성상 현재 상품A의 재고 수량 정보가 날아가 버린다.
이러한 경우에 어떻게 재고수량정보를 복구해야할지 생각해본 방법은 아래와 같다.
1. 상품 A에 대한 이전 주문정보와, 결제처리정보등을 종합하여 (전체 재고 - 처리된 재고)를 계산하여 남은 재소 수량을 DB(MySQL)에 복구한다.
2. redis 장애를 대비하여 데이터를 영구저장하는 방식을 활용한다.
- 방법 1. AOF - 데이터 변경 커맨드가 들어오면 커맨드를 그대로 저장한다.
- 방법 2. RDB - 저장 당시의 메모리의 모습 그대로를 스냅샷 형태로 파일로 저장한다.
3. replication을 활용하여 복제본을 둔다.
해당 프로젝트는 특정 시간에 상품 수량보다 훨씬 많은 사용자가 접근하는 것으로 가정하고 프로젝트를 진행하였기 때문에, 상품 오픈 이후 5 ~ 10분 내에 주문 완료 정보를 DB에서 체크하고, 문제가 발생했다면 주문 완료 정보를 토대로 DB에 수량정보를 복구하는 방식을 사용한다고 가정한다.
추후 학습 -> AOF, RDB의 저장방식과 redis아키텍처에 대해서는 추가적으로 공부해보면 좋을 것 같다.
[참고자료]
'프로젝트 > 예약상품' 카테고리의 다른 글
[회고] 예약 상품 프로젝트 (0) | 2024.03.04 |
---|---|
[프로젝트] 회복탄력성(CircuitBreaker와 Retry) (0) | 2024.03.02 |
[프로젝트] 상품 오픈시간에 같은 사용자의 여러 요청을 대비하자 (0) | 2024.02.26 |
[프로젝트] redis로 동시성 문제를 접근해보자 (0) | 2024.02.26 |
[프로젝트] synchronized 영역 최소화하기 (0) | 2024.02.24 |