이 게시글은 주니어개발자의 시야로 작성된 글입니다.
이 방법보다 좋은방법이 무수히 많을 수 있습니다.
비난보다는 좋은방법을 댓글로 알려주신다면 고민해보고 공부할 수 있을 것 같습니다 🙂
선착순 쿠폰이벤트 설계 는 서버개발자 면접을 보다보면 쉽게 마주칠 수 있는 문제중 하나이다.
면접뿐만 아니라 실제로 업무를 하다가도 한번쯤은 마주칠 문제이다. 이 때 중심적으로 봐야할건 크게 2가지가 있다고 생각한다.
- 동시성
- 트래픽
대부분의 선착순 쿠폰이벤트는 선착순 x개 를 주는 이벤트이다.
그렇다보니 특정시간대에 접속자(요청량)가 늘게 되고 이것을 버틸 수 있는 인프라가 준비되어야 할것이다.
두번째는 정확하게 x개의 쿠폰만 발급 되어야 하기 때문에 동시성을 고려하여 설계해야한다.
동시성이 고려되지 않는다면 x개 이상의 쿠폰이 발급될수도, 이미 발급된 쿠폰을 여러명의 사용자에게 부여될수도 있다.
이 시스템을 만드는데는 여러가지 방법이 있다. 트래픽 대응으로는 오토 스케일링이 있을 수 있다.
하지만 대부분의 클라우드 서비스의 오토 스케일링은 갑작스러운 트래픽 변화에 즉각 반응하지 않는다. 즉, 잠시동안의 장애가 발생한다는 것이다.
이것을 해결하기 위한 제일 간단한 방법은 예상되는 트래픽만큼 서버를 미리 늘려 놓는것이다. (이마저도 예측을 잘못하면 장애가 발생할 수 있다 ㅠㅠ)
조금 복잡한 방법으로는 요청을 redis 와 같은 저장소에 담아놓은 후 서버에서 수용할 수 있는 트래픽만 받을 수 있도록 하는것이다. (우아한 테크 유튜브를 보고 배웠다.)
동시성문제는 정말 골치아프면서도 어려운 문제이다. 아직은 어떻게 구현할지는 모르겠으나
- 유저의 요청을 1번에 1개만 처리한다.
- 유저가 요청할때마다 쿠폰저장소에서 순서대로 1개씩 발급해준다.
순서대로 와 1번에 1개 에서 우리는 힌트를 얻을 수 있을 것이다. 1번에 1개 = 싱글스레드라면 1번에 1개의 작업만 할 수 있다. 순서대로 = 큐 또는 스택을 생각할 수 있을것이다. 저장소에 있는 데이터들이 한쪽방향으로 일정하게 흐른다.
redis 를 사용한다면 비교적 간단하게 해결할 수 있을 것 같다.
redis 는 queue 자료구조를 지원하며, 싱글스레드이다! 즉, 동시성이 보장된다고 볼 수 있다.
하지만 느리다면 redis 를 사용할 수 없을것이다. 다행히도 redis 는 in-memory 이기떄문에 속도가 굉장히 빠르며, 우리가 사용하고자 하는 queue 의 시간복잡도는 O(1)로 굉장히 빠른 작업이다.
결론적으로 미리 서버를 늘려놓는 작업(+오토 스케일링) 과 redis 를 활용하여 선착순 쿠폰 시스템을 만들 수 있다.
이 설계는 이러한 가정을 토대로 설계되었습니다.
- 쿠폰은 미리 만들어 주 DB에 적재합니다.
- 이벤트에 사용할 쿠폰을 캐시용도로 Redis 에 담습니다.
- 캐시 발급 후 후처리는 쿠폰을 저장하는 곳에서 합니다. (이 예제에서는 MQ Consumer 에 해당합니다.)
이 설계에는 이러한 문제점이 있습니다.
- Redis 에 의존적입니다. 트래픽이 폭발하여 Redis 장애가 일어난다면 서비스 장애로 이어지게 됩니다.
'개발 > 시스템 설계' 카테고리의 다른 글
간단한 distributed-lock 구현하기 (0) | 2022.04.10 |
---|
댓글