CASE · INTERMEDIATE읽기 24분검토일 2026-08-29VERSIONED RANK
실시간 게임 리더보드 설계
현재 순위만 맞는 것으로는 부족합니다. 동점·점수 정정·시즌 마감 뒤에도 같은 board version을 재현할 수 있도록 점수 원장과 읽기 모델을 나눕니다.
25운영자 직접 작성·기술 검토·최종 검토 2026.08.29
순위 모델점수 입력면접 질문장애 대응진도 저장
♜30초 핵심 요약
검증된 score event를 멱등 원장에 기록하고 동점은 점수→도달 시각→player ID로 결정합니다. 시즌 보상은 correction과 projection 대사가 끝난 board version snapshot으로 확정합니다.
INPUTevent id + player sequence
READTop N · rank · around-me
TRUTHseason version + adjustment
DESIGN DECISION · 설계 판단
동점·시즌 마감·점수 정정 뒤에도 같은 순위를 어떻게 재현할 것인가?
예시 이벤트9,600만/day
계산 결과
예시 피크 ingest약 38,900/s
계산 결과
예시 hot board800만 players
설계 가정
최종 선택
score ledger + deterministic tie key + versioned reward snapshot
검증된 경기 점수를 immutable event와 adjustment로 기록하고 score·reached_at·player_id 순서로 tie를 고정합니다. 시즌 보상은 correction cutoff와 projection 대사 뒤의 board version snapshot으로 확정합니다.
선택 이유
같은 원장을 replay하면 shard와 무관하게 같은 동점 순서를 만듭니다.
부정 점수 정정을 과거 overwrite 없이 설명할 수 있습니다.
시즌 reset과 보상 지급을 명시적 version 경계로 운영합니다.
포기한 대안
현재 score row와 단일 sorted set을 직접 수정
중복·역순·correction 근거가 사라지고 시즌 보상 시점의 순위를 다시 재현할 수 없습니다.
감수한 단점
tie key와 board version을 모든 projection에 동일하게 적용해야 합니다.
hot board shard merge는 신선도와 global rank 비용을 만듭니다.
지급 뒤 correction은 보상·회수 운영 case가 필요합니다.
01 · REQUIREMENTS
빠른 순위와 재현 가능한 경쟁 결과를 함께 만든다
# 요구사항
검색 캐시가 최종 예약 권한이 아니듯, rank cache도 보상·분쟁의 정본이 아닙니다. 실시간 화면의 freshness와 시즌 보상의 정확성을 다른 경로와 상태로 설계합니다.
IN권한 있는 점수
match authority만 score event를 제출하고, client 누적 점수는 최종 정본이 아닙니다.
RANKTop N·내 주변
Top N, 내 rank, 내 주변 K명을 board version과 freshness로 반환합니다.
TIE결정적 동점
score 뒤 first-reached time과 player id로 재현 가능한 tie-breaker를 둡니다.
점수 수집에서 시즌 보상까지score event → state → rank shard → merge/cache → snapshot
표시 계약 · read API는 board_version, computed_at, freshness_seconds를 반환합니다. Top N cache와 글로벌 merge가 늦으면 last-known-good 여부를 표시하고, reward는 승인된 snapshot 밖의 잠정 rank로 지급하지 않습니다.
03 · SCORE FLOW
점수를 한 번 적용하고, 순위는 버전과 함께 읽는다
# 요청 흐름
1Authorize
match authority가 event id·sequence·ruleset을 만들고 workload identity로 제출합니다.
2Accept
gateway가 hash·season·match를 검사한 뒤 durable event log에 수락합니다.
3Apply once
state가 duplicate·stale sequence를 판별하고 score와 tie key를 원자 전진합니다.
4Rank shards
유효 score를 shard rank revision으로 반영하고 local Top M을 냅니다.
5Read + reconcile
merge/cache가 Top N과 around-me를 제공하고 snapshot job이 winner를 대조합니다.
04 · TRADEOFFS
실시간 rank의 단순함과 hot board 확장성을 비교한다
# 대안 비교
단일 sorted set은 읽기가 단순하지만 hot board에서 한계가 옵니다. 점수 원장과 tie-break는 유지하고 Top N·around-me projection만 규모에 맞게 shard합니다.
선택
강점
주의점
적합한 경우
단일 sorted set
Top N·rank·around-me가 단순
hot key와 memory/CPU 한계
작은 board·낮은 update
player-hash shard
write 분산과 격리
global rank·Top N merge 필요
대형 이벤트·다지역
local Top M merge
global Top N read fan-out 절감
M 경계·shard 누락·staleness 운영
Top N 화면 중심
rank-on-read
최신 rank를 계산 가능
hot player 조회 비용 증가
낮은 read 또는 admin 조사
materialized around-me
모바일 화면이 빠름
score 변동 invalidation 비용
refresh 주기가 고정된 UX
async fraud adjustment
수집 경로 지연·조사 격리
잠정 rank·correction을 설명해야 함
복잡한 anti-cheat
05 · FAILURE MODES
점수, shard, cache, 시즌의 실패를 따로 복구한다
# 장애 시나리오 8개
↻score retry·duplicate
network 재전송이 같은 점수를 여러 번 올려 rank를 왜곡합니다.
대응 · event id/hash unique와 state conservation; duplicate 억제율을 확인합니다.
⌛역순 sequence
늦은 이벤트가 이미 반영된 최신 score를 되돌리려 합니다.
대응 · conditional last sequence와 stale event audit; player replay를 대조합니다.
!hot shard 포화
이벤트 종료·influencer stream이 한 board shard의 P99와 lag를 올립니다.
대응 · salting/region split와 local Top M; key skew와 backlog drain을 검증합니다.
×merger shard 누락
global Top N이 한 shard의 revision을 빼고 계산됩니다.
대응 · revision gap 검출, last-known-good 표시, scoped rebuild를 실행합니다.
⇄cache stale
종료된 시즌 또는 오래된 rank가 화면에 남습니다.
대응 · versioned key·pointer rollback; freshness_seconds와 mismatch를 봅니다.
?anti-cheat 오배포
정상 유저가 제외되거나 cheater가 대량 노출됩니다.
대응 · canary·kill switch·rule version rollback; adjustment 계보를 샘플 감사합니다.
▣season pointer 조기 전환
화면 보드와 보상 cutoff가 서로 다른 version을 가리킵니다.
대응 · freeze→snapshot→approve→swap runbook; winner hash를 재현합니다.
game server identity, match ownership, nonce·sequence 검증을 적용합니다. public profile projection만 rank model에 두고 IP·fingerprint·support note를 trace와 cache에서 배제합니다.
identity · consent · audit
⌁관측 가능성
accepted/rejected, duplicate/stale sequence, shard queue age, revision gap, Top N freshness, tie diff, pending invalid rate, snapshot hash를 version별로 봅니다.
event → state → rank
₩비용 모델
active member·tie key·replica·mutation rate, merge fan-out, friend join, event/archive, anti-cheat inference, season rebuild·support를 따로 계산합니다.
hot board × refresh × retention
면접 모드 · 추가 질문06:00
“시즌 마지막 10분에 수백만 플레이어가 동시에 score update를 보내고 Top 100·내 주변 순위를 10초마다 갱신합니다. duplicate·역순 이벤트, hot board, 동점, anti-cheat correction, season reward cutoff를 어떤 정본·version·shard·복구 지표로 설명하겠습니까?”
event id + sequencesorted rank modeldeterministic tielocal Top M mergeboard versionadjustment ledgerreward snapshot
답변 구조 보기 5단계
시즌 점수 산식과 동점 순서를 하나의 결정적 규칙으로 고정한다.
server-authoritative event ID와 player sequence로 중복·역순 입력을 차단한다.
원장을 정본, sorted set과 shard Top M을 versioned 읽기 모델로 둔다.
correction은 immutable adjustment로 반영하고 시즌 reset은 새 board pointer로 전환한다.
reward snapshot은 correction cutoff·watermark·projection 대사가 끝난 뒤 확정한다. 이번 선택: 멱등 점수 원장과 결정적 tie key를 사용하고 hot board는 versioned shard projection으로 제공한다. 깨지는 신호: 같은 원장에서 재구축한 순위가 다르거나 지급 snapshot 뒤 근거 없는 score overwrite가 발생한다. 다음 검증: 동점 burst·역순 event·시즌 전환·late correction을 replay해 Top N과 reward snapshot hash를 비교한다.
INTERVIEW ↔ PRACTICE · 면접과 실무의 차이
한 게임의 순위 규칙을 설명하고 시즌 correction·보상을 운영하기
INTERVIEW · 면접
점수 산식과 동점 규칙을 먼저 고정한 뒤 저장 구조를 답합니다.
event ID·player sequence·tie key를 설명합니다.
ledger와 sorted projection을 구분합니다.
season pointer·correction cutoff·reward snapshot을 말합니다.
PRACTICE · 실무
동점과 late correction을 replay해 board와 보상 hash를 비교합니다.