최신 좌표가 있다고 보여 줄 권한까지 있는 것은 아닙니다. 동의·만료·친구·차단 상태를 결과 직전에 다시 확인하고 철회가 cache와 예약 알림까지 닫히게 합니다.
운영자 직접 작성·기술 검토·최종 검토 2026.08.29
개념 이해동의·인가위치 흐름장애 대응진도 저장
⌖30초 핵심 요약
짧은 TTL 위치는 근접 후보를 찾는 데만 사용합니다. 결과와 알림은 최신 관계·동의 정책을 다시 확인하고, 철회 event가 위치·cell index·cache·예약 알림을 같은 version으로 제거하게 합니다.
동의 경계scope + expiry
검색 경계TTL spatial index
노출 경계friend graph auth
DESIGN DECISION · 설계 판단
동의 철회가 위치·cache·예약 알림을 모두 닫게 하려면 어떻게 할 것인가?
예시 동의 사용자60만 명
계산 결과
예시 피크 갱신약 3,000 writes/s
계산 결과
예시 위치 TTL5분
설계 가정
최종 선택
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
중요: 공간 인덱스는 “가까울 가능성이 있는 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 셀 routing
shard와 hot cell 제어가 명확
경계 병합·해상도 선택이 필요
대규모 event routing, 도시 편향
enter마다 푸시
즉시성이 높음
GPS 흔들림·밀집 지역 spam
hysteresis + 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를 두겠습니까?”
위치 공유를 opt-in session으로 만들고 scope·정밀도·expiry·policy version을 저장한다.
TTL 공간 인덱스는 후보만 만들며 최종 읽기는 친구·차단·공유 정책을 다시 확인한다.
out-of-order 위치는 device sequence·captured_at으로 막고 위치 나이를 응답에 노출한다.
근접 알림은 hysteresis·cooldown 뒤에도 전송 직전 동의와 policy version을 재검사한다.
revoke-to-hide, purge lag, stale exposure 표본을 한 철회 사건으로 추적한다. 이번 선택: coarse cell·짧은 TTL·최종 인가를 결합하고 철회 event가 위치·cache·예약 알림을 함께 닫게 한다. 깨지는 신호: 철회 뒤 검색 결과가 남거나 오래된 queue event가 provider에 전달된다. 다음 검증: 출퇴근 hot cell과 graph 장애를 재현해 fail-closed 지연, 배터리, revoke-to-hide 60초 목표를 함께 측정한다.