Project/Team

신입 개발자 동시 접속자 2만 명 프로젝트 경험

빈코 2022. 4. 27. 17:20

입사 4개월 차에 동접자 2만명이 넘는 프로젝트 백엔드단을 맡게 되었습니다. 이벤트성 사이트로 선착순 10,000명을 채우면 이벤트 종료가 되는 프로젝트로 빠르면 일주일 내에 마감이 될 거라는 말을 듣고 지레 겁먹었던 기억이 나네요. 제가 설계했던 부분과 어떤 점에 초점을 두고 개발했는지 공유해보려고 합니다.

 

트래픽
선착순 이벤트 어렵다..!

 

 개요

앞서 말씀드린 것처럼, 상시 이벤트가 아닌 정해진 날짜의 선착순 이벤트이며 회사 관련 프로젝트이기 때문에 모든 것을 자세히 적어놓을 수는 없을 것 같아요. 회사 측에는 접속자가 들어온 통계를 보는 그라파나(Grafana) 대시보드와 제가 설계했던 과정은 포스팅하는 것을 허락해주셨어요. 

 

이번 프로젝트는 선착순 10,000명을 대상으로 했던 것이며 참여 인원들은 다시 한번 선착순으로 마음에 드는 기념품을 선택해서 신청하는 프로세스였습니다. 그렇기 때문에 저는 선착순 10,000명을 끊어내는 로직해당 참가자들의 기념품을 카운트하는 로직에 초점을 두고 개발을 했어요.

 

제가 이 회사에 입사하기 전 작년 이벤트에서는 백단 로직에 문제가 있어서 참가인원과 기념품 선택에서 4천여 건이 초과되어 서비스 업체한테 많은 욕을...

 

하여간 이번 년도 이벤트에는 그런 불상사가 일어나면 안 되기 때문에 많은 부담감과 책임감을 느꼈습니다. 물론 저는 신입 개발자이기 때문에 만들었던 코드들의 리뷰를 지속적으로 받았습니다. 특히 결제 관련 로직들은 선배님들이 많이 도와주셨어요. 선착순 제도는 경우의 수가 정말 많기 때문에 제가 생각한 저의 의견도 많이 어필했는데, 제 의견도 많이 수용되어서 더욱더 프로젝트에 애정도 쌓이고, 이런 개발 문화에서 일할 수 있음에 항상 감사한 마음으로 개발을 했습니다.

 

 

대용량 트래픽

사실상 대용량 트래픽의 기준은 정말 추상적인 것 같아요. 어느 누구한테는 동시접속자 2만명이 적은 수치일 수 있지만, 처음 접해보는 저에게 2만 명은 생각 외로 많은 수치였습니다. 처음에는 아래 사진과 같이 사이트 오픈하기 전에 4천여분의 참가자가 미리 대기를 하고 있었어요.

 

사이트오픈대기
4,145명 대기자

그래도 나름 프로젝트를 설계했을 때 스케일 아웃(Scale out)으로 서버를 6대로 구성하며 WEB/WAS단 을 분리 구성하여 메모리적으로 부하가 안 걸리게 하였고, 트래픽 유량제어 시스템을 도입해서 한 번에 너무 많은 사용자가 들어오지 못하게 막아놨기 때문에 큰 걱정은 안 했습니다. 하지만 이벤트 시간이 다가올수록 인원수는 급격하게 올라갔고, 결국엔 2만 2천 명이 넘는 사용자가 동시 접속하게 되었어요.

 

Scale out(수평 확장)
서버의 수평 확장은 동일한 목적을 갖는 서버를 여러대 추가하는 방법입니다. 이 경우 한 서버에 장애가 발생해도 다른 서버가 서비스를 제공할 수 있기 때문에 중간중간 오류사항들을 빠르게 수정해 배포하는 점에도 문제가 없고, 한 서버가 과부하가 걸려 다운돼도 다른 서버로 대체할 수 있기 때문에 제가 이 프로젝트에 사용한 방법입니다.


2만명참가자
22,450명 참가대기자

  이벤트가 시작하기 전 저는 '나도 기념품 좋으니깐 신청해야겠다'라고 생각하고 있었는데.. 신청은 커녕 서버 다운될까 봐 계속 초조하게 기다리고 있었습니다. 결과론적으로 이벤트는 3시간 만에 선착순을 모두 성공적으로 채웠습니다(짝짝)

 

 

설계 다이어그램

다이어그램
다이어그램

이 부분은 앞에서 다 설명드렸던 것 같네요! 짧게 요약하자면 메모리 부하때문에 WEB/WAS 서버를 구분하여 총 서버 6대로 구성하였고, 메가펜스라는 트래픽 유량제어 서비스를 이용해서 많은 참가자가 한 번에 신청할 수 없게 앞단에서 막아주었습니다.

 

메가펜스
메가펜스 모니터링

 

또한 메가펜스 Admin Page를 이용해서 그라파나(Grafana) 대시보드에 현재 사이트 동시 접속자 수를 체크하여 초당 통과수를 유동적으로 변경하면서 사용자의 편의성을 높이기 위해 노력했어요. 

 

 

 

아쉬웠던 점

첫번째로는, 참가자 선착순은 제대로 작동하여 인원을 초과하는 현상이 없었지만 기념품 카운트면에서 수치가 초과하는 건들이 몇 개 있었습니다. 나름 많은 경우의 수를 생각하면서 로직을 구현했었는데 많은 아쉬움이 남았어요. 기념품 카운트는 결제 콜백을 받으면 계속해서 기념품의 카운트를 업데이트합니다.

 

업데이트할 때, 들어오는 건수마다 카운트를 +1 해주는 것이 아닌 전체 DB에서 해당 기념품을 고른 참가자들의 수를 세서 업데이트를 쳐주는 방식으로 진행했어요. 숫자로 선택하면 +1 환불하면 -1 사이즈 바꾸면 -1 복원하면 +1 등 너무 경우의 수가 많아진다고 판단했습니다. 

 

결과론적으로, 완벽하게 구현은 하지 못했던 것 같네요. 제일 신경을 많이 썼는데 이 부분에서 200건가량의 오차가 있어서 많은 아쉬움이 남습니다. 물론 이만 명의 결제자가 재고 막바지에 결제를 동시에 해서 카운트가 막바지에 이르러 막기전에 오버 나는 것도 있었을 테지만요..!


두 번째로는, 세션 처리입니다. 제가 사용했던 Scale out(수평 확장)의 문제점 중 하나가 다중 서버 환경에서 사용자가 특정 서버에 Session을 가질 때 로드 밸런스에 의해 다른 서버에 라우팅 되면 Session이 끊기는 문제점이 있었어요. 

 

로컬에서 테스트를 진행했을 때 가장 많이 느낀 점이 '내가 개발하고 내가 테스트하는 것에는 한계가 너무 많다.'였습니다. 저 스스로 로직을 잘 알다 보니깐 당연하게 입력해야 할 값들을 순서적으로 잘 입력하는 것은 몰론이거니와 나 자신도 모르게 같은 루틴으로 테스트해보면서 '많은 오류를 잡기 위해 다양한 관점에서 생각해야겠구나'라고 생각이 들었어요. 

 

이번 세션 문제도 마찬가지였습니다. 당연히 로컬에서는 세션이 끊길 일이 없어서 문제 되지 않았던 건데, 서버가 여러대로 나뉘었을 때의 경우의 수는 미처 생각하지 못했던 게 아쉬운 마음이 크네요. 

 

 

 

마치며

이번 프로젝트를 하면서 저의 부족함을 많이 느끼기도 했고, 한 프로젝트를 설계부터 서비스까지 하다 보니 많은 애정이 쌓이는 걸 몸소 느꼈어요. 단기간의 짧은 이벤트였고 동시 접속자도 2만여 명에 불과했지만(몰론 저한테는 큰 수치), 재미있게 개발했던 것 같아요. 앞으로는 다른 프로젝트를 배당받아 열심히 나아갈 것 같습니다.

 

아! 그리고 오류가 났던 부분들은 서버단에 log 쌓인 것을 보고 원인 분석을 열심히 해 나가려고 합니다. 세션 처리는 Sticky Session(고정 세션)이라는 것을 알게 되어서 업무 시간 외에 공부해보려 해요. 조만간 세션에 대해서 공부 후 열심히 포스팅해보겠습니다.

 

지금까지 부족했던 코딩 실력과 글 솜씨를 봐주셔서 감사합니다

 


👨‍💻 전자책 출간

아울러 제가  🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁

https://kmong.com/gig/480954

 

비전공개발자 2년만에 중견기업 들어간 방법 | 14000원부터 시작 가능한 총 평점 0점의 전자책, 취

0개 총 작업 개수 완료한 총 평점 0점인 Binco의 전자책, 취업·이직 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 취업·이직 전자책 제공 등 14000원부터 시작 가능한 서비스

kmong.com


 

 

반응형

'Project > Team' 카테고리의 다른 글

Smart Encoder 프로젝트 후기  (1) 2023.04.18
MCMS-YJCF 프로젝트 후기  (0) 2022.11.23
MCMS-YC 프로젝트 후기  (0) 2022.08.01
MCMS-YGPA 프로젝트 후기  (0) 2022.07.11