민족 대명절 추석을 맞아 버스표를 예매하는데, 버스 예매 서버가 터져있더군요..
다행이도 몇일 전에 예매를 해두어서 버스터미널에서 표를 뽑았는데, 문득 코레일처럼 대기표 시스템이 있었다면 문제를 예방할 수 있지 않을까 생각이 들었습니다
특히 라이믹스로 쇼핑몰과 같은 상업 플랫폼을 만들때, 갑자기 트래픽이 몰리는 현상이 발생하면 난감해지기 때문에 만들어도 쓸모가 있을것 같아 도전해보았습니다
^ 실제 화면 ^
우선 위와같이 대기인원, 자신 뒤에 인원, 예상 대기시간을 표시해주고, 2초마다 갱신을 합니다.
그리고 자신의 순번이 되었다면 사이트를 표시해주면 되는 간단한 구조입니다.
제가 제작한 프로그램의 구조는 다음과 같습니다.
(버스에서 필기한거라 글씨가 날라가네요 ㅜㅜ)
우선 로드밸런서를 기본적으로 거치게하여 여러개의 프록시 서버에 골고루 접속을 분배해줍니다.
프록시 서버는 1개 이상 존재할 수 있으며, 서버의 부하율에 따라 자동으로 스케일링됩니다.
또한 토큰 저장을 위해 Redis 서버를 활용하여, 여러개의 프록시 서버를 사용해도 데이터에 문제가 없도록 구성하였습니다.
이렇게 무조건 프록시 서버를 거치도록 만들어 둔다면, 일부 유저의 대기열 우회 시도를 봉쇄할 수 있는 장점이 있습니다.
다음으로 유저들의 접근 방식입니다.
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
(특, 콘서트 예매 자주 합니다..)