match authority만 score event를 제출하고, client 누적 점수는 최종 정본이 아닙니다.
실시간 게임
리더보드 설계
순위는 숫자 하나가 아닙니다. server-authoritative score event를 멱등·sequence 경계로 적용하고, Top N·내 주변 rank는 빠른 파생 모델로 읽으며, 부정행위 조정과 시즌 보상은 버전이 있는 원장으로 재현합니다.
점수 이벤트는 `score_event_id`와 player sequence로 한 번만 적용합니다. sorted rank read model은 빠른 Top N·rank·around-me를 제공하지만 정본이 아니며, hot board는 shard의 local Top M을 merge합니다. 시즌은 새 version pointer로 전환하고 correction·reward snapshot은 삭제하지 않습니다.
빠른 순위와 재현 가능한 경쟁 결과를 함께 만든다
검색 캐시가 최종 예약 권한이 아니듯, rank cache도 보상·분쟁의 정본이 아닙니다. 실시간 화면의 freshness와 시즌 보상의 정확성을 다른 경로와 상태로 설계합니다.
Top N, 내 rank, 내 주변 K명을 board version과 freshness로 반환합니다.
score 뒤 first-reached time과 player id로 재현 가능한 tie-breaker를 둡니다.
reset pointer, immutable snapshot, correction을 분리해 winner를 재현합니다.
이벤트 원장과 빠른 rank 모델의 책임을 분리한다
점수를 한 번 적용하고, 순위는 버전과 함께 읽는다
match authority가 event id·sequence·ruleset을 만들고 workload identity로 제출합니다.
gateway가 hash·season·match를 검사한 뒤 durable event log에 수락합니다.
state가 duplicate·stale sequence를 판별하고 score와 tie key를 원자 전진합니다.
유효 score를 shard rank revision으로 반영하고 local Top M을 냅니다.
merge/cache가 Top N과 around-me를 제공하고 snapshot job이 winner를 대조합니다.
실시간 rank의 단순함과 hot board 확장성을 비교한다
| 선택 | 강점 | 주의점 | 적합한 경우 |
|---|---|---|---|
| 단일 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 |
점수, shard, cache, 시즌의 실패를 따로 복구한다
network 재전송이 같은 점수를 여러 번 올려 rank를 왜곡합니다.
늦은 이벤트가 이미 반영된 최신 score를 되돌리려 합니다.
이벤트 종료·influencer stream이 한 board shard의 P99와 lag를 올립니다.
global Top N이 한 shard의 revision을 빼고 계산됩니다.
종료된 시즌 또는 오래된 rank가 화면에 남습니다.
정상 유저가 제외되거나 cheater가 대량 노출됩니다.
화면 보드와 보상 cutoff가 서로 다른 version을 가리킵니다.
친구 보드에 비공개 프로필이 cache된 채 남습니다.
순위의 신선도, 공정성, 비용을 한 화면에서 본다
game server identity, match ownership, nonce·sequence 검증을 적용합니다. public profile projection만 rank model에 두고 IP·fingerprint·support note를 trace와 cache에서 배제합니다.
accepted/rejected, duplicate/stale sequence, shard queue age, revision gap, Top N freshness, tie diff, pending invalid rate, snapshot hash를 version별로 봅니다.
active member·tie key·replica·mutation rate, merge fan-out, friend join, event/archive, anti-cheat inference, season rebuild·support를 따로 계산합니다.
순위 자료구조와 서비스 계약은 공식 문서에서 확인한다
- Redis — Sorted sets: member/score와 rank·range 조회를 제공하는 sorted set 공식 문서.
- Redis — ZADD: member score 추가·갱신 옵션의 공식 명령 참조.
- Redis — ZRANK: sorted set member rank 조회 공식 명령 참조.
- Amazon DynamoDB — Condition expressions: 조건부 write의 공식 예시.
- Microsoft PlayFab — Leaderboards: leaderboard 정의·버전 기능 공식 문서.
- RFC 4122 — UUID URN Namespace: event identifier 형식 논의에 참고할 표준 문서.
작성·검토·참고 자료
참고 자료
- Redis — Sorted sets — score/member와 범위·순위 조회가 가능한 sorted set 자료형 공식 문서.
- Redis — ZADD — member score 추가·갱신과 옵션의 공식 명령 참조.
- Redis — ZRANK — sorted set member rank 조회 공식 명령 참조.
- Amazon DynamoDB — Condition expressions — 조건이 성립할 때만 write를 수행하는 공식 예시.
- Microsoft PlayFab — Leaderboards — leaderboard 정의와 버전·통계 기반 기능의 공식 문서.
- RFC 4122 — UUID URN Namespace — UUID 식별자 형식 표준 문서. event id의 생성 정책은 이 문서의 별도 설계 가정이다.
사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.