민족 대명절 추석을 맞아 버스표를 예매하는데, 버스 예매 서버가 터져있더군요..

 

다행이도 몇일 전에 예매를 해두어서 버스터미널에서 표를 뽑았는데, 문득 코레일처럼 대기표 시스템이 있었다면 문제를 예방할 수 있지 않을까 생각이 들었습니다

 

특히 라이믹스로 쇼핑몰과 같은 상업 플랫폼을 만들때, 갑자기 트래픽이 몰리는 현상이 발생하면 난감해지기 때문에 만들어도 쓸모가 있을것 같아 도전해보았습니다

 

 

스크린샷 2022-09-10 오전 2.18.02.png.jpg

^ 실제 화면 ^

 

우선 위와같이 대기인원, 자신 뒤에 인원, 예상 대기시간을 표시해주고, 2초마다 갱신을 합니다.

 

그리고 자신의 순번이 되었다면 사이트를 표시해주면 되는 간단한 구조입니다.

 

 

KakaoTalk_Photo_2022-09-10-02-32-30.jpeg

 

제가 제작한 프로그램의 구조는 다음과 같습니다.

(버스에서 필기한거라 글씨가 날라가네요 ㅜㅜ)

 

우선 로드밸런서를 기본적으로 거치게하여 여러개의 프록시 서버에 골고루 접속을 분배해줍니다.

 

프록시 서버는 1개 이상 존재할 수 있으며, 서버의 부하율에 따라 자동으로 스케일링됩니다.

 

또한 토큰 저장을 위해 Redis 서버를 활용하여, 여러개의 프록시 서버를 사용해도 데이터에 문제가 없도록 구성하였습니다.

 

이렇게 무조건 프록시 서버를 거치도록 만들어 둔다면, 일부 유저의 대기열 우회 시도를 봉쇄할 수 있는 장점이 있습니다.

 

 

KakaoTalk_Photo_2022-09-10-02-26-21.jpeg

 

다음으로 유저들의 접근 방식입니다.

 

1번 유저에 경우, 대기열이 없으니 바로 라이믹스 서버에 연결됩니다.

 

2번 유저부터는 앞에 1번 유저가 작업을 하고 있으니, 바로 접근이 불가능합니다.

 

이럴 경우, 서버에서 임의의 토큰을 생성하여 아래의 작업을 진행합니다.

 - GET요청일 경우 대기 HTML 페이지를 리턴해주며, POST요청에 경우도 대기 HTML 페이지를 리턴하나, 특정 파라메터를 입력하면 자신의 대기번호와 토큰을 JSON으로 반환합니다.

 

이 방법을 사용하기 위해 라이믹스에 js 파일을 추가하여 $.ajax 함수를 오버라이딩합니다.

(대기번호화 토큰이 반환되었다면 대기함. 대기 후 라이믹스 서버에서 처리 완료시 success 함수 실행하도록 패치)

 

또한 나중에 프록시 서버 설정과 라이믹스가 연동할 수 있게 된다면, 특정 act만 해당 대기열을 거치도록 하는 등의 개선 작업도 예상하고 있습니다.

 

 

 

사실 이렇게 말로만 하면 이해가 어렵지는 않으나, 실제 저 시스템을 구상하는데 상당히 골머리를 앓았습니다..

 

만약 소규모 서버에 1만명의 사람들이 동시에 서버에 접속하였다고 가정하겠습니다.

 

대략 최초 100명정도만 통과하고 나머지는 대기열에 걸렸다고 가정하면, 초당 1만건 이상의 http 요청이 들어올 것이며, 실시간으로 자신의 순위 계산과 데이터 갱신이 필요합니다.

 

즉, 이는 프록시 서버의 처리 속도가 매우 빨라야하며, 데이터 처리시에 알고리즘도 신경써서 설계해야한다라는 겁니다.

 

덕분에 하루종일 Redis 문서와 데이터 처리 알고리즘만 공부하면서 심심하지 않게 하루를 보낸것 같습니다 ㅋㅋ

 

1차 개발 목표는 초당 1만건의 요청에도 거뜬한 서버 만들기입니다 XD

 

 

이 프로그램은 Go 언어로 만들어졌으며, 다음과 같은 오픈소스를 사용하였습니다.

https://github.com/valyala/fasthttp

https://github.com/go-redis/redis

 

 

 

사실 요새는 대기열 시스템이 아닌 WEB/WAS 서버 자체의 스케일링이 더 많이 사용되고 있습니다만, 라이믹스는 단일 서버로 동작해야하는 특성상 이 방법을 적용하기가 어려워 대체제를 만들어보았습니다.

 

레퍼런스를 찾아보려고 솔루션을 제공하고 있는 회사들도 찾아보았는데, 기본적으로 소프트웨어 비용만 수천만원이 넘어가더군요..

 

지금 당장 사용될 일은 없겠지만 완성된다면 다른 프레임워크에 비해 라이믹스가 강력한 장점을 지니게 될 수도 있겠네요 XD

리버스

profile
모듈 제작하는 현역 대학생 리버스입니다!

== 판매중인 모듈 ==
미션] https://xetown.com/thirdparties/1511787
길드] https://xetown.com/thirdparties/1387146
  • Lv24
    어우 접속 대기만 봐도 화가 치밀어 오르는 걸요...
    (특, 콘서트 예매 자주 합니다..)
  • Lv24 Lv9
    판매시각 맞춰서 눌렀는데 매진 메세지 뜨면 그것만큼 허탈한것도 없죠.. ㅎㅎ..
  • ? Lv4

    비슷하지만 좀 다른 개념이긴한데요,
    저는 소켓을 활용한 실시간 서비스를 개발하면서 분산 처리를 최적화 하는 작업을 했었네요.
    thread, master, workers, que, sync/async, timeout, interval 말은 쉬운데 분산된 자원에서 중복 접속에 대한 처리와 분산 데이터를 하나로 합치는게 골 아팠습니다.

    이런 작업이 기술적으로 흥미와 난이도가 있지만 아쉬운 점은 수요를 찾기가 쉽지 않은 것 같습니다.

  • ? Lv4 Lv9

    분산처리에서 데이터 정합성 보존이 제일 어려운 것 같습니다

    데이터가 중복으로 들어가기도 하고, 어디선가 누락되기도 하고..

    이상적으로 돌아가기만 한다면 어려울 것도 없지만, 현실에서는 상상치도 못한 예외들이 많이 발생하다보니 더욱 고달프네요 ㅜㅜ

  • ? Lv2
    비슷한게 클플에도 있긴해요.
    https://www.cloudflare.com/ko-kr/waiting-room/

    비즈니스(월 $200) 부터 이용가능해서
    트래픽 폭주할만큼 규모 있는 회사면 클플 비즈니스 쓰면서 같이 딸려있는 기능쓰는게 안정적이고 더 가성비있어보입니다.
  • Lv3
    와~ 대단하셔요. 서버에 대해 관심이 있는 초보에게 logic과 구조등을 이렇게 쉽고 자세히 설명해주시니 감사할 따름입니다.