TIL

10장 실시간 게임 순위표

1단계: 문제 이해 및 설계 범위 확정

2단계: 개략적 설계안 제시 및 동의 구하기

API 설계

개략적 설계안

graph LR
  client[client] -->|1.게임에서 승리| game[게임 서비스]
  game -->|2.점수 갱신| rank[순위표 서비스]
  client -->|4-a.순위표 조회| rank
  client -->|4-b.플레이어 순위 정보 조회| rank
  rank -->|3.점수 갱신| store[(순위표 저장소)]
  
  1. 사용자가 게임에서 승리하면 클라이언트는 게임 서비스에 요청을 보낸다.
  2. 게임 서비스는 해당 승리가 유효한지 확인하고 순위표 서비스에 점수 갱신 요청을 보낸다.
  3. 순위표 서비스는 순위표 저장소에 기록된 해당 사용자 점수를 갱신한다.
  4. 해당 사용자 클라이언트는 순위표 서비스에 요청하여 상위 10명 순위표와 해당 사용자 순위를 가져온다.

데이터 모델

3단계: 상세 설계

클라우드 서비스 사용 여부

graph LR
  client[클라이언트] --> lb[로드밸런서]
  lb --> webserver[웹서버]
  webserver -->|순위표 정렬 집합| redis1[(redis)]
  webserver -->|사용자 세부정보| mysql[(MySQL)]
  webserver -->|상위 10명 프로필 캐시| redis2[(redis)]
graph TB
subgraph 사례2: 순위 검색
		rankservice[순위표 서비스] -->|순위표 보기| gateway[게이트웨이]
	  gateway --> lambda[AWS 람다]
	  lambda -->|ZREVRANGE| redis[(레디스)]
	  lambda -->|사용자 세부 정보 조회| mysql[(MySQL)]
	end
	
	subgraph 사례1: 점수획득
		rankservice1[순위표 서비스] -->|게임 승리| gateway1[게이트웨이]
	  gateway1 --> lambda1[AWS 람다]
	  lambda1 -->|ZINCRBY| redis1[(레디스)]
	  lambda1 -->|점수 입력| mysql1[(MySQL)]
	end

레디스 규모 확장

대안: NoSQL

graph LR
	rankservice[순위표 서비스] --> gateway[게이트웨이]
	gateway --> lambda[AWS 람다]
	lambda --> dynamodb[(DynamoDB)]
	
전역 보조 색인 전역 보조 색인 속성 속성 속성
파티션 키 (PK) 정렬 키(score user_id email profile_pic