Mass Ticket | 100만 동시 접속을 견뎌내는 티켓 예매 서비스

송은석·2023년 8월 12일
5

MassTicket

목록 보기
1/1

개인적인 이유로 프로젝트는 잠정 중단하게 되었습니다. (23.09.10)

안녕하세요, 개발자 송은석입니다.

새로운 토이 프로젝트를 하나 시작해보려고 합니다. 주제는 "티켓 예매 서비스 만들기" 인데요, 자세한 설명은 아래에서 함께 보시죠!


서비스 개요

  1. 서비스의 목적이 무엇인가요?

    2023년 내한했던 브루노 마스의 티켓 예매 사이트 동접자가 100만을 넘었던 것을 모티브로 삼아 이와 같은 티켓 예매 시스템을 설계, 구현해보고자 했습니다.

  1. 누가 이 서비스의 대상인가요?

    • 티켓을 구매하고자 하는 티켓 예매 사이트에 가입한 유저들 (사이트 가입 유저 200만 추정)

    • 2023.06 브루노 마스 티켓팅을 기준으로, 100만의 유저가 동시간 대에 티켓 구매 요청을 할 것으로 예상합니다.

  2. 서비스를 위해 충족해야 하는 요구사항은 무엇인가요?

    • 동접자 100만의 트래픽을 처리할 수 있어야 합니다.

    • 접속한 순서대로 티켓을 예매할 수 있어야 합니다.

    • 티켓은 좌석 마다 하나 씩 발급 되어야 합니다.

    • 1명의 유저당 최대 3개의 티켓을 구매할 수 있습니다.

    • 예매 완료 시 유저는 자신이 예매한 티켓 정보를 조회할 수 있습니다.



티켓 예매 프로세스

티켓 예매는 어떻게 진행되어야 할까요?

사용되는 기술 및 상세 구현을 시작하기 전, 간략하게 예매 흐름을 작성 해보았습니다. 실제 구현될 내용과는 다를 수 있습니다.

예매 전

  1. 아래의 티켓팅 정보를 등록합니다. (실제 DB 테이블 내용과는 다를 수 있습니다.)

    • 티켓팅할 행사 이름

    • 티켓팅 시작 시간

    • 행사 시 사용될 티켓 좌석

      • 티켓 좌석 번호
      • 티켓 좌석 등급
      • 티켓 좌석 금액

예매 시

  1. 사용자가 예매 준비 페이지에 접속합니다. 예매를 하기 위해서 유저는 로그인 된 상태이어야 하며, 지정된 시간부터 예매가 가능합니다.

  2. 예매 가능 시간 이후부터 “예매하기” 버튼을 통해 예매 대기열 페이지로 접속이 가능합니다.

    ex. 예매 가능 시간이 오전 10시부터 시작일 경우, 10시 0분 0초부터 예매 대기열 페이지 접속이가 가능합니다.

  3. 접속한 인원들은 우선 대기열 페이지로 이동합니다.

    • 생각할 점
      • 대기 페이지에 있는 인원들은 어떻게 관리할 것인가?
  4. 대기열 페이지에서 선착순 n명의 인원만 예매 페이지로 이동하여 좌석 예매를 시작하도록 합니다.

    • 생각할 점
      1. 선착순 n명을 어떻게 측정할 것인가? 정합성을 보장할 방법이 있는가?
      2. n명의 기준은 어떻게 정할 것인가?
  5. 예매 페이지에 접속한 유저는 좌석을 선택합니다.

    • 이 때, 최대 3자리를 선택할 수 있고, 각 좌석의 등급, 가격은 다를 수 있습니다.
    • 생각할 점
      • 좌석 선택에 시간 제한을 두어야 하는가?
        • YES 현재 대기 열이 있기 때문에, 좌석 선택은 20분 안에 완료되어야 한다. 그렇지 않으면 접속을 강제 종료시킨다.
  6. 좌석을 선택한 유저는 결제 페이지로 넘어갑니다.

    • 결제 페이지에서 다시 자리 선택 화면으로 이동할 수 없습니다.
    • 좌석 선택 후 7분 이내에 결제가 이루어지지 않으면 선점한 자리가 해제되고, 접속이 강제 종료됩니다.
  7. 결제까지 완료되었을 경우, 티켓 예매 접속이 종료됩니다.

  8. N명 만큼 예매 페이지 접속이 종료되면, 그리고 남은 티켓이 존재한다면 대기 페이지에 있는 유저를 최대 N명만큼 선착순 예매 페이지로 이동시킵니다.

    • 만약 남은 예매 티켓이 존재하지 않는다면, 대기자들의 접속을 종료시킵니다.




기능 정의 및 기능 별 서버 분리

전체 시스템 추상화

  • 구체적으로 어떤 기술을 사용할지는 정하지 않은 상태에서, 전체적인 데이터의 흐름을 바탕으로 시스템을 추상화해보았습니다.

    • 전체 시스템 구성도
  • 프로젝트에서 주로 다룰 부분은 아래의 3 서버 애플리케이션입니다.

    1. User, Ticket Info를 관리하는 User and Ticket Info Management Server

    2. 티켓 예매를 기다리는 유저들을 순차적으로 관리하는 Queue Management Server

    3. 좌석 예매 기능을 제공하는 Ticketing Server



서버별 주요 기능 및 구조도

주요 기능 위주로 나눈 각 서버의 구체적인 기능, 그리고 간단한 시스템 구조를 작성해보았습니다.

User And Ticket Info Server

  • 유저의 회원 가입 및 로그인, 로그아웃, 그리고 티켓팅 정보를 관리하는 서버
  • 기능
    • 유저 회원 가입 기능
    • 유저 로그인 기능
    • 유저 로그아웃 기능
    • 티켓팅 정보 등록

Queue Management Server

  • 티켓팅 대기열을 관리하는 서버
  • 기능

    • 유저 선착순 등록 기능

      • 접속한 유저들을 선착순으로 등록하여 관리합니다.
    • 유저 연결 기능

      • 웹소켓을 통해 유저들과의 연결을 유지합니다.
      • 웹소켓을 통해 실시간으로 유저들에게 필요한 메시지를 전달합니다.
    • 티켓팅 서버 리다이렉트 기능

      • 스케줄러를 통해 주기적으로 티켓팅 서버로 이동할 수 있는 유저의 수를 파악합니다.
      • 이동할 수 있는 유저의 수만큼 티켓팅 서버 액세스 토큰을 등록합니다.
      • 이후 웹소켓을 통해 티켓팅 서버로 리다이렉트할 수 있도록 하는 메시지를 클라이언트에 전달합니다.

Ticketing Server

  • 티켓팅 기능을 제공하는 서버
  • 기능
    • 토큰 기반 접속 기능

      • 접속 토큰이 있는 유저만 접근을 허용합니다.
    • 유저 연결 기능

      • 접속 시 웹 소켓을 연결하고, 토큰에 대한 만료 시간을 10분 뒤로 설정합니다.
        • 생각할 점
          • 웹소켓에 대한 시간 처리는 어떻게 할 것인가? 가령, 10초가 지나갔을 경우 해당 시간을 클라이언트에 어떻게 전달할 것인가?
          • 서버가 다운되었을 때, 어떻게 복구할 수 있는가?
    • 좌석 선택 기능

      • 좌석 선택 시, 현재 전체 좌석 상태와 함께 좌석 선택 성공 여부를 반환합니다.
        • 선택이 된 좌석이면, 실패 응답을 전달합니다.
        • 아직 선택되지 않은 좌석이면, 좌석을 선점 처리합니다.
        • 전달되는 좌석 상태는 선점된 좌석 목록입니다.
      • 좌석 선택이 완료되면, 결제 페이지로 넘어갑니다.
      • 10분 내로 좌석 선택을 완료하지 못하면, 선택한 좌석을 모두 비선점 상태로 바꾸고 접속을 종료시킵니다.
    • 결제 기능

      • 결제 페이지 접속 시 결제에 대한 만료 시간을 7분 뒤로 설정합니다.
      • 7분 내 결제를 완료하지 못하면, 선택한 좌석을 모두 비선점 상태로 바꾸고, 접속을 종료시킵니다.
      • 결제 완료 시 티켓을 생성하고, 토큰을 제거하고 접속을 종료합니다.



프로젝트 소개를 마치며

프로젝트 소개글 치고는 여러 내용을 다룬 것 같습니다😂

프로젝트의 처음은 유저 • 티켓 서버(User And Ticket Info Server)를 개발하는 것으로 시작될 것 같습니다.

그럼 다음 개발이 진행된 후에, 다시 찾아뵙겠습니다. 감사합니다.



*PS. 중간 중간 있는 각 시스템의 구성도를 보시면서 분산 서버 환경은 고려하지 않았나요? 라는 질문을 하실 수도 있을 것 같습니다. 현재 단계에서 각 시스템은 단일 서버 기준으로 설계된 상태입니다. (DB나 Redis 역시 마찬가지 입니다.) 이는 현재 상태에서 안정적으로 유지될 수 있는 최대의 수준을 테스트하고, 이를 기반으로 분산 서버 환경을 구축하고자 했기 때문입니다.

*프로젝트에 대해 나누고 싶은 의견이 있으시다면, 댓글이나 이메일로 남겨주시면 감사하겠습니다.

참고

  • [브루노 마스 내한공연, 예매 동접자 100만대 기록…전좌석 매진], 전자신문인터넷, 2023.04.28 기사
profile
Done is better than perfect🔥

1개의 댓글

comment-user-thumbnail
2023년 8월 12일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기