3. Create
다양한 형태의 퀴즈 제작
01
No Login
퀴즈 참여 - Only 닉네임
02
Easy Play
PC & 스마트폰 지원
03
Competition
실시간 경쟁
04
엠퀴즈 핵심 기능
4. 엠퀴즈 시연 안내
라이브 시연
3. 퀴즈플레이
영상
2. 퀴즈제작
영상
1. 회원가입
퀴즈 플레이 참여를 원하시는 분은
휴대폰 카메라를 미리 준비 해주시기 바랍니다
5. 퀴즈 참여 방법
닉네임 입력
2-1. URL 접속
퀴즈 풀기 선택 PIN 번호 입력
URL + 핀번호로
접속
http://www.mquiz.site/p/PIN번호
URL 로 접속
http://www.mquiz.site
Or
1. QR 접속
16. 유저 동시 접속
시간당 459,000 명 안정적 접속
02
DevOps(CI/CD)
Frontend Pipeline
Backend Pipeline
Rolling Update
04
클라우드 기반
실시간 게임
구현 목표
실시간 게임
Websocket, Redis, Rabbit MQ
01
Container 환경
Gradle, package.json
환경 변수 분리 , Stateless, ECS
03
17. 진행자
: WebSocket
2.1 퀴즈 플레이 전체 통신 흐름
참가자
Lambda Log
데이터
Show
데이터
DynamoDB
Redis
RabbitMQ Spring
boot
Spring
boot
18. 진행자
WebSocket
Message 구조
참가자 화면
참가자
진행자 화면
서버
Redux
Redux
2.2 진행자 게임 화면 제어
Command
(Start)
퀴즈 시작 전
대기 화면
퀴즈 시작 화면
Command
화면 제어 퀴즈 시작
중간 결과
최종 결과
3
개
Command
유저 제어
로비 대기
닉네임 체크
강퇴
정답 제출
퀴즈 종료
5
개
19. RabbitM
Q
2.3 서버 구조
Redis
퀴즈진행
3. 게임 서버
1. 인증 서버
인증 서버
인증 서버
2. Lambda
퀴즈 관리 로그 관리
퀴즈진행
퀴즈진행 퀴즈진행
퀴즈 , 로그 관리
로그인
다중 컨테이너
퀴즈 진행
실시간 게임
데이터 관리
21. 1. 실시간 점수
랭킹 계산
Redis Cluster
구축
3.1 Redis - 성능 최적화
3. 안정적인
데이터 저장
Redis - Sorted Set Redis TTL
2. 메모리 관리
ZADD( 점수 설정 ) - O(log(N))
ZRANDMEMBER( 점수 증가 ) -
O(N)
ZMSCORE( 점수 가져오기 ) - O(N)
ZRANGE ( 전체 조회 ) - O(log(N)+M)
1. 게임 종료 시 사용했던
메모리 할당 해제
2. 4 시간의 TTL 적용 - 자동삭제
1. 데이터 유실 최소화
2. AWS ElastiCache 를 이용한
3 개 노드로 클러스터 구축
22. 3.1 Redis - 설계 구조
2. Sorted Set
참가자 정답 개수
참가자 랭킹 점수
제출자 수
데이터 산정
1. Set
Show ID
Email 인증번호
중복 제어
3. Hash
퀴즈 데이터 분리 및 저장
특정 데이터 조회
4. List
전체 퀴즈 데이터 조회
23. 3.2 NoSQL - DB 최적화
초기 RDB
RDB
LOG
데이터
SHOW
데이터
NoSQL
다중 테이블
Join 호출
프로젝트 구조상
NoSQL 이 적합하다고
판단
24. 3.3 NoSQL - Show 데이터 전체 구조
2. NoSQL 저장 형태
1. Show 데이터 설계
{
"_id": "638af7d04f2229040345b52a",
"quizInfo": {
"email": "[email protected]",
"title": "",
"tags": [],
"createDate": "",
"lastModifyDate": "",
"isPulic": true,
"state": ""
},
"quizData": [
{
"num": 0,
"type": "",
"question": "",
"media": {
"type": "",
"url": ""
},
"choiceList": {
"num1": "",
"num2": "",
"num3": "",
"num4": ""
},
"answer": [],
"time": 0,
"useScore": true,
"rate": 0
},
],
"_class": "com.mzc.quiz.show.entity.Show"
}
27. 3.4 NoSQL - LOG 전체 데이터 구조
실제 저장 데이터
LOG – 진행된 전체 퀴즈 데이터
{
"id":"id",
"showid":"showid",
"email":"email",
"showtitle":"showtitle"
"playdate":"playdate",
"quizcount":"quizcount",
"Usercount":"usercount",
"userdata":[
{
"nickname":"test",
"rank":"1",
"rankscore":"12345",
"correctcount":"12",
"iscorrectlist":"0,1,-1"
},
{
"nickname":“nickName",
"rank":“2",
"rankscore":“112233",
"correctcount":"10",
"iscorrectlist":"0,1,-1"
}
]
}
( 닉네임 , 랭킹 , 정답 수 등 )
37. EC2
Instance Type Purpose Cost Amount Total Cost
T3.small
(vCPU2, RAM 2GB)
ECS Cluster Instance $19.86 /m 5 $99.28 /m
T2.large
(vCPU2, RAM 8GB)
Dev Server
(Jeknins, Grafana)
$88.77 /m 1 $88.77 /m
Lambda
Architecture Purpose Memory Request / Month 실행시
간
Total Cost
x86_64 Show, Log API 128MB 3 천만 300ms $24.75 /m
6. –
인프라 예상 비용 Compute $140
t3.small * 1 $ 23.31 /m
38. Elastic Load Balancer
Type LCUs New Conn /S Active Conn /M Processed bytes / H Amount Total Cost
Application 1 25 3000 1GB 2 $47.16 /m
NAT Gateway
Data Processed / month Amount Total Cost
100 GB 1 $51.46 /m
Amazon MQ (Rabbit MQ)
Type Purpose Broker EBS OutBound Traffic Total Cost
Rabbit MQ MQ 1 개 200GB 100G $49.75 /m
6. 인프라 예상 비용 Network & RabbitMQ $ 140
39. Role Engine Instance Type Deployment Option Billing option Total Cost
Primary Mysql t3.mirco Single-AZ On-Demand $18.98 /m
DynamoDB
ElastiCache
Table Class Capacity mode DataSet Read Units Write Units Total Cost
Standard Provisioned 10GB 5 5 $6.10 /m
Engine Instance Type Instance Number Billing option Total Cost
Redis t3.mirco 3 On-Demand $56.94 /m
MySQL
6. –
인프라 예상 비용 DB $ 80
40. EBS
Volume Type Storage IOPS Snapshot Amount Total Cost
gp2 30 GB 100 / 3000 0 GB 6 $21.60 /m
S3
Volume Type Storage PUT/COPY/POST GET Amount Total Cost
Standard 100 GB 1000 K 1000 K 1 $8.63 /m
ECR
Data stored Type Amount Total Cost
50GB Private 2 $20 /m
6. –
인프라 예상 비용 Storage $ 45
42. 1. 테스트 전제조건
사용자 수
( 단위 : 명 )
플레이 수
( 단위 : 시간당 횟
수 )
1 게임 req
( 단위 : 명당 횟수 )
시간당 req
( 단위 : 시간당 횟
수 )
진행자 1
3
17 51
참가자 50 12 1,800
총계 51 3 29 1,851
1 시간당 1,000 게임 진행
총 req: 1,851 X 1,000 = 1,851,000 req
43. 2. 테스트 시나리오
시간당 게임
1000, 2500, 5000
단위 스케일 아웃
반복횟수
서버 과부하 시
컨테이너 2 개 증가
반복횟수 조정
컨테이너 8 개 도달 후
최종 목표 미달성 시
1000 혹은 500 단위로 증감 ,
최적 컨테이너 수량 도출
최적 컨테이너 도출
Locust
테스트 도구
48. 5. 테스트 결과
진행자 수
( 단위 : 명 )
참가자 수
( 단위 : 명 )
총 사용자 수
( 단위 : 명 )
성공
( 단위 : Container)
실패
( 단위 : Container)
1000 50,000 153,000 6 4
2500 125,000 382,500 8 6
3000 150,000 459,000 8 -
3500 175,000 535,500 - 8
4000 200,000 612,000 - 8
5000 250,000 765,000 - 8
49. 0.9vCPU, RAM 0.9 GB * 8 개
Redis : t3.mirco * 3 개
Rabbit MQ : t3.mirco * 1 개
Lambda : Managed by AWS
5. 시스템 성능 평가
안정 수치
초과 처리
클러스터
확장 필요
Play 서버
구성
평균치의 3 배
확장 성능
목표 수치
900rps
안정 수치
550rps