SA시스템 디자인 아틀라스 CASE STUDY / LOCATION 학습 로드맵
CASE · ADVANCED읽기 26분검토일 2026-08-23

주변 친구 서비스
설계

주변 친구는 지도 위의 점을 찾는 기능이 아닙니다. 사용자가 허용한 시간과 범위 안에서만, 관계가 허용된 사람에게만, 오래되지 않은 위치를 대략적으로 보여 주는 동의·인가·공간 검색 시스템입니다.

개념 이해동의·인가위치 흐름장애 대응진도 저장
30초 핵심 요약

최근 위치는 짧은 TTL의 공간 인덱스에서 후보를 찾는 데만 씁니다. 결과를 보여 주기 전에는 공유 세션의 동의·만료와 양방향 친구 그래프 인가를 재확인합니다. 근접 알림은 좌표 갱신마다 보내지 않고 enter/exit 상태 전이, hysteresis, cooldown을 거친 뒤 fanout합니다.

동의 경계scope + expiry
검색 경계TTL spatial index
노출 경계friend graph auth
01 · REQUIREMENTS

좌표보다 먼저 동의와 관계를 판정한다

# 요구사항

“근처”라는 후보 생성과 “보여도 되는가”라는 인가는 다른 문제입니다. 공유 중지·정확도 수준·block·친구 해제가 결과와 알림보다 먼저 적용되어야 합니다.

R1만료되는 공유 세션

범위·정밀도·종료 시각을 서버가 서명한 session으로 고정합니다.

R2정책 기반 ingestion

권한, device binding, accuracy, stale 시각, 속도를 검사합니다.

R3양방향 그래프 인가

후보마다 friend edge, block, scope, expiry를 확인합니다.

R4조용한 근접 알림

enter 전이와 cooldown 뒤, 전송 직전에 다시 opt-in을 봅니다.

02 · HIGH-LEVEL DESIGN

최근 위치·관계·알림을 서로 다른 수명으로 둔다

# 아키텍처

ingestion은 유효한 관측값을 이벤트로 만들고, indexer가 현재 위치와 TTL 공간 인덱스를 갱신합니다. read API는 후보를 좁힌 뒤 친구 그래프와 동의를 확인합니다. notification은 별도 queue로 격리합니다.

동의 검증부터 공간 후보·인가·근접 알림까지 SVG DIAGRAM · consent / spatial / graph / fanout
주변 친구 서비스의 위치 수집, 공간 인덱스, 친구 그래프 인가, 근접 알림 구조모바일과 웹 클라이언트의 위치 갱신은 동의와 만료 검증 뒤 이벤트 스트림으로 들어간다. 공간 인덱서가 TTL 공간 인덱스와 현재 위치를 갱신한다. 주변 친구 조회는 공간 후보를 얻은 뒤 친구 그래프와 공유 정책을 확인하며, 근접 전이 worker가 알림 정책을 거쳐 FCM과 APNs로 전달한다.동의·만료 → 최근 위치 → 공간 후보 → 관계 인가 → 상태 전이Mobile / Webpermission · devicelocation sampleIngest APIconsent · expiryaccuracy · idempotencyLocation streamobserved_at fencecoalesceSpatial indexercell shard · TTLcurrent locationNearby read APIradius candidates → bandsstale / accuracy filterFriend graph authfriend · block · scopefail closedTransition workerenter / exithysteresisNotification policy → FCM / APNsopt-in · cooldown
중요: 공간 인덱스는 “가까울 가능성이 있는 ID”를 줄이는 용도입니다. 위치 공유 scope·만료, 친구·차단 상태, 위치 나이와 정확도를 통과한 뒤에만 거리 구간을 반환합니다.
03 · REQUEST FLOW

쓰기의 최신성과 읽기의 인가를 각각 보장한다

# 요청 흐름

클라이언트는 관측값을 보낼 뿐이고, 서버가 그것을 보관·노출·알림해도 되는지를 판정합니다. `observed_at`과 TTL은 오래된 표본이 현재처럼 보이는 일을 줄입니다.

1공유 세션

동의 범위·정밀도·expiry를 서버가 기록합니다.

2검증·수락

권한, device, accuracy, idempotency를 확인합니다.

3TTL 인덱싱

순서 fence 뒤 cell과 current location을 갱신합니다.

4후보·인가

반경 후보에 graph, block, scope를 batch로 적용합니다.

5전이·fanout

enter 상태와 cooldown을 기록하고 전송 직전 재검사합니다.

04 · TRADEOFFS

정확도와 즉시성의 이득은 노출·비용과 함께 온다

# 트레이드오프
선택장점제약권장 판단
정확 좌표 표시거리·만남 안내가 직관적stalking·재식별 위험이 큼강한 상호 동의, 짧은 명시 세션에 한정
거리 밴드 / 대략 셀프라이버시와 UI 안정성 개선정밀한 길 안내에는 부족주변 친구의 기본 노출값
Redis GEO 최근 인덱스반경 후보 검색이 단순정본·친구 인가·보존은 별도 문제짧은 TTL의 점 기반 근접 검색
H3/geohash 셀 routingshard와 hot cell 제어가 명확경계 병합·해상도 선택이 필요대규모 event routing, 도시 편향
enter마다 푸시즉시성이 높음GPS 흔들림·밀집 지역 spamhysteresis + cooldown + opt-in으로 대체
05 · FAILURE MODES

여덟 가지 실패를 노출 차단과 복구 검증으로 다룬다

# 장애 시나리오
opt-out 전파 지연

중지한 위치가 cache나 예약된 알림에 잠시 남을 수 있습니다.

대응 · ingestion 차단, TTL 제거, pending fanout 취소. 철회 뒤 노출 0건을 검증합니다.
event stream 적체

인덱스가 뒤처져 오래된 위치가 후보에 섞일 수 있습니다.

대응 · queue age 경보, stale 제외, drain worker. `observed_at` lag 목표를 확인합니다.
hot cell 폭주

행사장 같은 셀에서 후보 수와 p99가 급증합니다.

대응 · 더 작은 cell, shard, 후보 상한. cell별 p99·과다 후보 표본을 봅니다.
friend graph 장애

관계를 확신할 수 없는데 위치를 보여 주면 안 됩니다.

대응 · fail closed, 제한적 version cache, reconciliation. block 이벤트 완결성을 대조합니다.
out-of-order·GPS 점프

늦은 표본이나 낮은 정확도가 false enter를 만들 수 있습니다.

대응 · 시각 fence, accuracy gate, hysteresis. false transition과 중복 알림률을 봅니다.
index 부분 손실

일부 사용자가 검색에서 사라지거나 결과가 불완전해집니다.

대응 · current-location 재색인, shard health, 표본 비교. cell별 완결성을 검증합니다.
FCM/APNs 지연

근접 알림이 늦어져 이미 의미가 없어질 수 있습니다.

대응 · provider별 queue·circuit breaker·만료. 복구 후 정책 내 drain만 허용합니다.
×삭제 purge 실패

탈퇴·삭제한 위치의 파생 복사본이 남을 위험이 있습니다.

대응 · tombstone, purge scanner, 재삽입 차단. 모든 저장소 erase receipt를 대조합니다.
06 · OPERATIONS

개인정보·관측·비용을 좌표 밖에서 운영한다

# 운영 관점
보안과 개인정보

원본 좌표·친구 목록·token을 trace와 URL에서 제외합니다. TLS, device binding, 역할 기반 접근, 최소 정밀도·보존과 opt-out/delete fanout을 기본으로 둡니다.

scope · expiry · tombstone
관측 가능성

ingest decision, 위치 나이, index lag, hot cell 후보 수, graph 허용/거부, transition, 철회→purge 지연을 ID·좌표 없이 단계별로 봅니다.

stale · auth · purge lag
비용 모델

배터리·업로드·event stream·TTL 메모리·graph batch·notification fanout·삭제 운영이 함께 증가합니다. TTL을 늘리면 stale 후보와 삭제 노출 창도 커집니다.

valid recent location / cost
면접 모드 · 5분 답변05:00
“하루 2,160만 개의 위치 갱신을 받는 주변 친구 기능을 설계하세요. 사용자는 언제든 공유를 끄고 친구·차단 관계가 바뀔 수 있습니다. 어떤 ingestion 계약, 공간 인덱스, graph 인가, 알림 중복 방지, 삭제 SLO를 두겠습니까?”
consent + expiryTTL spatial indexgraph fail closedhysteresis + cooldownpurge reconciliation
SOURCES

공식·1차 출처

RELATED CASE STUDY알림 시스템 설계
EDITORIAL NOTES

작성·검토·참고 자료

콘텐츠 원칙
이 문서는 독립적으로 재작성한 한국어 학습 자료입니다. 사실과 학습용 설계 가정을 구분합니다.
최종 검토
예상 학습 시간
26분

참고 자료

사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.