해결된 질문
작성
·
318
3
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
안녕하세요. "비연결성" 강의를 보던 중 궁금한 것이 생겨 질문을 올립니다. 순간적으로 몰리는 이벤트를 위해 설계를 다음과 같이 구성하기도 하는지 궁금합니다.
특별 이벤트 페이지를 운영할 때, 짧은 시간 동안 유저들이 몰려 트래픽이 급증하는 경우가 많습니다. 예를 들어, 오후 6시부터 7시까지 1시간 동안 특별 이벤트가 진행된다면, 그 시간 동안 트래픽이 매우 높아질 것입니다.
이러한 상황에서 서버 증설을 고려하며 stateless한 서비스 구성이 중요한데, 이에 대한 다음과 같이 설계를 해보겠습니다. 예를 들어, '오후 6시부터 7시까지 1000명에 한해 20% 할인되는 콘서트 티켓 구매 이벤트'를 진행한다고 가정해보겠습니다. 이 경우, 유저가 이벤트에 참여한 후 즉시 결과를 알 필요는 없다고 생각합니다. 각 웹 애플리케이션 서버마다 독립된 DB를 두어, 이벤트 참여 여부만 해당 서버의 DB에 저장합니다. 그리고 오후 7시가 지난 후, 모든 서버의 DB에 있는 이벤트 관련 데이터를 한꺼번에 일관되게 처리합니다. 이때, 먼저 참여한 1000명을 선정한 후, 모든 참여자에게 이벤트 당첨 여부를 이메일이나 문자로 알립니다. 제가 볼때 이 구조는 마치 map-reduce 모델과 유사하고 단지 reduce 단계가 상대적으로 늦게 실행되는 구조입니다.
이러한 구조에 대해서 어떻게 생각하시나요? 또 이벤트를 위해 보편적으로 사용되는 아키텍쳐가 있을까요?
답변 1
1
안녕하세요. ybjeon01님
말씀하신 내용으로 처리할 수 도 있겠지만, 특정 서버에 오류가 발생한다면 해당 서버에서 응시한 사용자들은 모두 대상이 될 수 없는 문제가 발생할 수 있습니다.
보통의 경우 데이터베이스에 응모한 사용자를 저장하고 처리합니다.
감사합니다.
ybjeon01님 생각하신 내용이 맞습니다.
질문 내용중에 다음과 같이 이야기를 해주셨군요. 제가 해당 부분을 놓치고 애플리케이션 메모리에 저장한다고 생각했습니다.
-> 각 웹 애플리케이션 서버마다 독립된 DB를 두어, 이벤트 참여 여부만 해당 서버의 DB에 저장합니다. 그리고 오후 7시가 지난 후, 모든 서버의 DB에 있는 이벤트 관련 데이터를 한꺼번에 일관되게 처리합니다.
말씀하신 것 처럼 해결하는 것도 하나의 방법입니다. 하지만 이렇게 서버마다 독립된 DB를 두는 방식은 관리와 운영에 비용이 많이 들어갈 수 있습니다.
대신에 DB 자체를 샤딩과 같은 방법을 사용해서 분산하는 방법이 있습니다. 말씀하신 내용과 유사한 방법인데요. 웹 애플리케이션을 서버를 분할해서 증설하는 것이 아니라 DB 자체를 분할해서 증설하는 것이지요.
이렇게 하면 웹 애플리케이션 서버는 30대, DB는 4대와 같이 각각의 용도에 맞는 최적화가 가능합니다.
실제로 이런 방식은 많이 사용됩니다.
감사합니다.
답변 감사합니다.
특정 서버에 오류가 발생한다는 것은 제가 말한 구조뿐만 아니라 서버 증설을 하는 다른 아키텍쳐에서도 발생할 수 있는 문제가 아닌가요?