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

주변 친구 서비스
설계

최신 좌표가 있다고 보여 줄 권한까지 있는 것은 아닙니다. 동의·만료·친구·차단 상태를 결과 직전에 다시 확인하고 철회가 cache와 예약 알림까지 닫히게 합니다.

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

짧은 TTL 위치는 근접 후보를 찾는 데만 사용합니다. 결과와 알림은 최신 관계·동의 정책을 다시 확인하고, 철회 event가 위치·cell index·cache·예약 알림을 같은 version으로 제거하게 합니다.

동의 경계scope + expiry
검색 경계TTL spatial index
노출 경계friend graph auth
DESIGN DECISION · 설계 판단

동의 철회가 위치·cache·예약 알림을 모두 닫게 하려면 어떻게 할 것인가?

예시 동의 사용자 60만 명 계산 결과
예시 피크 갱신 약 3,000 writes/s 계산 결과
예시 위치 TTL 5분 설계 가정
최종 선택

versioned opt-in + short TTL + send-time authorization

coarse cell의 최근 위치는 후보 생성에만 쓰고, 읽기와 알림 전송 직전에 친구·차단·공유 session의 policy version을 확인합니다. 철회 event는 current location, index, cache, queued notification을 함께 purge합니다.

선택 이유

  • 철회 전 생성된 queue event도 provider 호출 전에 차단합니다.
  • 공간 index가 오래 남아도 읽기 API는 정책 오류에서 fail closed 합니다.
  • revoke-to-hide를 여러 저장 계층의 완료 조건으로 측정할 수 있습니다.
포기한 대안

TTL 만료만 기다려 위치와 알림을 자연 삭제

철회 뒤 최대 TTL 동안 검색 결과와 예약 알림에 사용자가 남아 개인정보 노출 경계를 지키지 못합니다.

감수한 단점

  • 읽기와 알림 경로가 정책 서비스 가용성에 의존합니다.
  • purge fan-out과 policy version cache 무효화가 복잡합니다.
  • 짧은 TTL과 coarse cell은 위치 신선도와 정확도를 낮춥니다.
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

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

# 트레이드오프

위치 정확도와 update 빈도를 높이면 즉시성은 좋아지지만 배터리·비용·노출 위험도 커집니다. 필요한 정밀도만 짧게 보유하고 권한을 매번 다시 확인합니다.

선택장점제약권장 판단
정확 좌표 표시거리·만남 안내가 직관적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
답변 구조 보기 5단계
  1. 위치 공유를 opt-in session으로 만들고 scope·정밀도·expiry·policy version을 저장한다.
  2. TTL 공간 인덱스는 후보만 만들며 최종 읽기는 친구·차단·공유 정책을 다시 확인한다.
  3. out-of-order 위치는 device sequence·captured_at으로 막고 위치 나이를 응답에 노출한다.
  4. 근접 알림은 hysteresis·cooldown 뒤에도 전송 직전 동의와 policy version을 재검사한다.
  5. revoke-to-hide, purge lag, stale exposure 표본을 한 철회 사건으로 추적한다. 이번 선택: coarse cell·짧은 TTL·최종 인가를 결합하고 철회 event가 위치·cache·예약 알림을 함께 닫게 한다. 깨지는 신호: 철회 뒤 검색 결과가 남거나 오래된 queue event가 provider에 전달된다. 다음 검증: 출퇴근 hot cell과 graph 장애를 재현해 fail-closed 지연, 배터리, revoke-to-hide 60초 목표를 함께 측정한다.
INTERVIEW ↔ PRACTICE · 면접과 실무의 차이

근접 계산을 설명하고 철회와 예약 알림 race를 운영하기

INTERVIEW · 면접

가까움보다 동의·친구·차단·만료가 먼저라는 경계를 답합니다.

  • TTL spatial index는 후보만 만든다고 설명합니다.
  • policy version과 send-time check를 말합니다.
  • hysteresis·cooldown과 철회를 다른 중복 경계로 나눕니다.
PRACTICE · 실무

철회 직전 생성된 알림을 남겨 revoke-to-hide를 끝까지 추적합니다.

  • location·cell·cache·queue purge lag를 관측합니다.
  • graph 장애에서 위치 노출이 fail closed인지 확인합니다.
  • provider timeout 재시도에서도 revoked event가 전송되지 않는지 검증합니다.
SOURCES

공식·1차 출처

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

작성·검토·참고 자료

콘텐츠 원칙
이 문서는 독립적으로 재작성한 한국어 학습 자료입니다. 사실과 학습용 설계 가정을 구분합니다.
작성·기술 검수
프로젝트 운영자가 직접 작성·기술 검토했습니다. 주제별 공식·1차 자료와 명시적인 설계 가정을 확인하며, 독립적인 제3자 검수가 아닙니다. 경력 범위와 검수 원칙 보기
최종 검토
예상 학습 시간
26분

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