이 때까지 프로젝트를 하며 락을 통한 방식으로 동시성 제어를 주로 해왔다. 하지만 이번에 도전하는 e-commerce 관련 프로젝트에서는 락의 방식으로 재고를 관리하면 응답속도가 떨어지고 데드락이 걸릴 확률이 높았다. 그래서 레디스를 공부하고자 레디스를 통해 재고 관리를 해보고자 하였고 고민한 내용을 작성하고자 한다.
프로젝트에 관해서 간략하게 설명을 하면 판매자가 상품을 사이트에 등록하면 구매자는 해당 상품을 조회하고 구매를 하는 프로젝트이다.
이 과정에서 상품에 대한 쓰기가 일어나는 부분은 두 가지가 있다.
1. 상품을 판매자가 등록하는 경우
2. 판매자의 상품을 구매자가 '결제를 하여' 구매하는 경우
읽기가 일어나는 부분도 두 가지가 있다.
1. 상품을 판매자나 구매자가 조회하는 경우
2. 구매자가 주문서를 넣는 경우(조회만 일어남)
우선, 이 문제에서 캐싱된 데이터가 사용되는 건 위의 모든 상황에서 사용이 된다. 캐시 전략을 어떤 방식으로 하는 게 적합할 지를 고려해봤을 때, 내가 선택한 방식은 약간 애매한 Write-Back과 Look aside cache 방식이다.
우선 DB에 있는 재고 관리 데이터를 서버가 뜨기 전에 미리 레디스 서버로 옮길 예정이다. 해당 이미지는 아래와 같다.

그러면 모든 서버에 있는 데이터가 올라갈 것이다. 그런데, 레디스는 정말 재고 관리만 싱글 쓰레드 형태로 다뤄 동시성을 제어하는 용도로만 사용할 것이기 때문에 레디스에서 상품에 관한 정보는 오로지 Key를 Product:ProductId:재고량, Vale를 현재 재고량 형태의 정보만을 담을 예정이다.
이렇게 하는 이유는 우선 재고가 남아있는지 확인하고 구매자가 요청한 수량에 대해서 가능한 지 여부를 DB를 거치지 않고도 판별이 가능하게 하기 위함이다. 대신 다른 정보를 올리지 않은 이유는 레디스 내의 메모리를 최대한 적게 사용하기 위함이다.
그 다음엔 서버가 뜨고 나서의 주문요청과 재고 결과에 대한 흐름은 대략 아래와 같다.

주문 요청이 들어올 때 주문을 넣을 수 있는 지를 Redis 내의 재고현황만을 체크하고 주문서를 넣는다. 이 때는 재고 변환이 없다.
그리고, 실제로 결제가 된 이후에는 스프링 트랜잭션으로 Redis에서 결제까지 묶되 재고가 부족한 경우엔 예외를 발생시켜 레디스 재고 부족으로 인한 싱크를 MySQL 서버에 맞추어주고 상황에 따라 주문 불가 상태로 바꾸거나 마감 임박 상태 등으로 바꿔줄 것이다. 대신 이 과정에선 롤백도 하여 결제 복구 프로세스가 한 번 더 필요할 것으로 예상이 된다.
또한, 이 과정에서 곤란한 점이 있다면 판매자가 재고를 변경했을 때 어떻게 처리할 것인가? 그리고 재고가 10개를 원하는데 9개만 남은 경우엔 어떻게 할 지 등의 상황에서 어떻게 처리할 지 등이 모호하긴 하지만 우선 이런 방식으로 읽기를 생각해봤다.
쓰기와 관련된 부분은 아래와 같이 동작시킬 것이다.

이제 위의 구조에선 우선 Redis 서버가 단일 장애 지점이 될 가능성이 높아졌다. Redis 서버에 대한 AOF나 RDS 등의 고민도 필요하지만 아직은 그 단계가 아니라 생각하며, 서버가 내려갔을 때 MySQL 서버로 아직 동기화가 되지 않을 때를 대비해 Product 변경 Log를 남길 것이다. 또한 이 정보를 통해서 스케줄러를 사용해 MySQL 서버의 재고를 비관적 락을 통해서 비동기 처리하여 재고를 변경시킬 예정이다.
사실 레디스에 관해서 처음 사용해보는 프로젝트이기도 하고 잘 생각이 안나서 고민만 이렇게 해봤는데, 우선 Product와 Redis만을 가진 토이 프로젝트를 간단하게 하나 만들어 볼 예정이다. 이 과정에서 Redis 내의 어떤 자료 구조를 선택할 지, 초기 Warm up 과정 등을 실험해보고 프로젝트로 끌고 들어와야 겠다는 생각이 들었다.
참고자료:
개인적으로 윗 유튜브는 Warm up 과정이나 캐싱 전략 관련된 기초적인 설명이 잘 돼 있어 좋았다. 그리고, 아래 유튜브는 둘 다 좋지만 맨 아래 것이 레디스 분산환경과 분배에 관해서 좋은 설명이 있어서 좋았다.
https://www.youtube.com/watch?v=92NizoBL4uA
https://www.youtube.com/watch?v=mPB2CZiAkKM
실전 레디스 - 하야시 쇼고
https://techblog.woowahan.com/2709/