Redis를 활용한 트래픽 감당기

Redis를 활용한 트래픽 감당기

선착순 프로모션 이벤트와 같은 유형의 특정 서비스는 이용자 트래픽이 순간적으로 몰리게 된다.

그에 맞춰 서비스를 정상적으로 운영하기 위해서는 실시간 모니터링, 트래픽 분산, 트래픽 대응 구조 설계 등 나름의 대비를 요한다.

그러면 순간 트래픽에 대응할 수 있는 방법에는 어떤 것들이 있을까?

방법은 다양하겠지만, 오늘은 Redis를 활용한 트래픽 제어 방법과 필자가 직접 테스트하고 현업에 적용해본 경험을 풀어보고자 한다.

서론

현재 필자는 매 달 한 차례 주기적으로 진행되는 선착순 프로모션 이벤트를 담당하고 있다.

위에서 말한 선착순 이벤트의 형태를 가지고 있기에 필자 또한 순간 트래픽을 어떻게 감당할지에 대한 고민을 자주 하곤 했다.

계속되는 연구와 시도에도 불구하고 마음에 드는 답을 찾지 못하던 중, 문득 생각이 들었다.

'비슷한 이벤트를 진행하는 다른 서비스들은 어떻게 순간 트래픽을 감당할까?'

이 생각을 토대로 검색 중 ‘우아한 테크 토크’ 에서 김민국 님이 Redis를 활용한 트레픽 제어를 주제로 발표하신 영상을 보고 아주 큰 영감을 받았다.

그 노하우에 대해 먼저 알아보자

한 줄로 서주세요, Sorted Set

Sorted Set이란?

Sorted Set은 Redis의 데이터 타입 중 순위 선정, 노출(게임 랭킹, 게시판 순위 등)을 위해 만들어졌다.

그렇기에 다른 타입들과는 달리 용도에 맞는 두 가지 특성을 가지고 있다.

  1. Key 하나당 n개의 중복되지 않는 값(member)을 가질 수 있다.
  2. Set과 구조적으로 유사하나 각 member는 score를 가진다. 즉 Key - Member - Score의 형태를 띈다.

위와 같은 특성을 가진 순위를 매기는 기능의 ‘Sorted Set’을 응용하여 접속하는 순서를 점수로 활용하여 순서대로 정렬해주는 용도로 사용한다고 생각하면 어떻게 활용될 수 있을까?

첫번째 특성에 따라 대기 순서에 오버 부킹(Over booking)과 같은 형태의 데이터 혼동을 주지 않을 것이고, 두번째 특성에 따라 마치 일렬로 줄을 서는 형태의 대기열을 얻을 수 있다.

이것이 이 노하우의 바탕이 되는 생각이다.

응용하고 구상하다

위 내용을 토대로 필자는 서비스에 적용할 로직을 간단히 그려보았다.


(가벼운 수준의 로직 드로잉)

먼저 사용자 별로 페이지에 접근 시 대기열(Waiting Sorted Set)에 순서대로 쌓고 대기 순서가 작성된 ‘순번 대기 페이지’를 노출해준다.

이후, 관리자가 설정해놓은 인입율에 따라 진입열(Access Sorted Set)로 이전을 시키고 마침내 사용자는 원하는 이벤트 페이지에 도달하게 되는 구조를 떠올렸다.

작성하고 시험하다

구상을 마친 필자는 바로 성능을 증명해줄 프로토 타입 개발에 나섰고 아래와 같은 1차적인 결과물이 나왔다.

(이미지 클릭하여 확대 가능)



(트래픽을 감당해줄 Sender)

(인입율을 제어해줄 임시 어드민)

1차적인 프로토 타입의 결과는 아주 훌륭했다. 비록 5,500건의 트래픽을 테스트했지만 구상했던 내용대로 잘 작동해주는 것을 보고는 흡족했다.

감당할 수 있나요? 대용량 트래픽

성공적인 첫 승을 한 필자는 과연 이 로직이 실제로 대용량 트래픽을 감당할 수 있을까? 에 대한 궁금증을 가지게 되었다.

아무런 준비 없이 테스트하기에는 그동안 패배의 경험이 많았기에 조금 더 디테일하고 견고한 구조로 재설계하여 트래픽 과부하 툴을 이용하여 테스트를 시작했다.


(욕심이 생겨 나름 UI도 그렸다)

약 33K의 트래픽을 거뜬히 감당하며 테스트가 성공한 순간 절로 감탄사가 나왔다.

1차 프로토 타입 로직으로 테스트를 진행할 때 예상하였던 트래픽 그래프를 그대로 보여주고 있었으며 모두 성공적인 응답을 하였다.


(타워형이 아닌 완만한 트래픽 곡선)

자체적으로 개발한 어드민 툴의 트래픽 과부하 그래프와 테스트 툴의 그래프가 일치하는 것을 보고는 어드민 툴에 대한 인입율 제어 또한 검증되었다.

마무리

Redis를 활용한 인입 제어 로직을 개발한 경험은 개인적으로 너무 즐거웠으며 성취감 또한 뛰어났다.

하지만 먼저 포스트 앞 전에 언급하였던 소중한 정보를 공유해주신 김민국님께 감사하다는 말씀을 전하고 싶으며 다시 한번 오픈 소스, 열린 개발 문화에 대해 감탄하게 되었다.

앞으로 필자도 꾸준히 포스트를 작성하여 다른 개발자들에게 정보를 공유해줄 수 있는 개발자가 되어야겠다.

참고

https://www.youtube.com/watch?v=MTSn93rNPPE

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×