•
앱 사용자 중 본인 위치 정보 접근을 허락한 사용자에 한해 인근의 친구 목록을 보여주는 시스템이다.
1단계: 문제 이해 및 설계 범위 확정
•
요구사항 가정
◦
주변의 정의, 여기선 대략 5마일로 설정하며 수정이 가능
▪
그 거리의 정의, 직선 거리인지? 이동까지 걸리는 거리인지
⇒ 보통은 복잡도 때문에 직선 거리를 사용할 것 같음
◦
사용자의 수, 그리고 그 중 이 기능을 사용하는 사용자의 수
◦
사용자의 이동 이력 저장 여부
◦
활성, 비활성 등 상태에 따른 표시 여부
▪
10분 이상 비활성화 상태일 경우, 주변 친구 목록에서 제외
◦
규제 사항, GDPR, CCPA 등의 사생활 및 데이터 보호법 적용 여부
기능 요구사항
•
사용자는 주변 친구를 확인할 수 있어야 한다. 주변 친구는 해당 친구까지의 거리, 해당 정보가 마지막으로 갱신된 시각이 함께 표시
•
이 친구 목록은 일정 주기로 한 번씩 갱신
비기능 요구사항
•
낮은 지연 시간
•
안정성 : 어느정도의 유실은 감수
•
결과적 일관성 : 위치 데이터를 저장하기 위해 강한 일관성을 지원하는 데이터 저장소를 사용할 필요는 없음
개략적 규모 추정
•
개럊주변 친구는 5마일 반경 이내의 친구로 정의
•
친구 위치 정보는 30초를 주기로 갱신
◦
이 수치는 사람이 보통 걷는 속도를 기준으로 한다.
◦
데이터가 변경되지 않는 동안에는 조회를 반복적으로 수행할 필요가 없다.
•
평균적으로 이 기능을 사용하는 사용자는 1억 명으로 가정
◦
하루 앱 사용자 10억 중 10%가 이 기능을 사용한다고 가정한다.
•
사용자의 평균 친구 수는 400명으로 가정, 그리고 모두가 주변 친구 검색 기능을 활용
•
페이지 당 대략 20명의 주변 친구를 표시하고 무한 스크롤이 가능하다.
•
QPS 계산
◦
DAU : 100,000,000
◦
동시 접속 사용자 : 10,000,000
◦
사용자는 30초마다 자기 위치를 시스템에 전송
◦
위치 정보 갱신 QPS는 대략 10,000,000 / 30 = 334,000
2단계: 개략적 설계안 제시 및 동의 구하기
•
이번 절에서는 다음 내용을 구성
◦
개략적 설계
◦
API 설계
◦
데이터 모델
•
기능의 특성 상, 지속적으로 연결을 유지해주어야 하기 때문에 HTTP 프로토콜을 사용하지 못할 수 있음을 감안
개략적 설계안
•
개념적으로 사용자는 근방의 모든 활성 상태 친구의 위치 정보를 주기적으로 수신
•
1대1로 요청을 수행할 수도 있겠지만 위치 변화 내역을 구독 대상들에게 전달하는 형태의 pub-sub 구조가 더 적합
설계안
•
웹소켓 서버
◦
친구 위치 정보 변경을 거의 실시간에 가깝게 처리하는 유상태 서버 클러스터로 각 클라이언트는 최소 한 대와 웹소켓 연결을 지속적으로 유지
◦
검색 반경 내 친구 위치가 변경되는 경우, 해당 내역은 이 연결을 통해 클라이언트에 전달
•
위치 정보 캐시 레디스
◦
특정 활성 시간 동안 갱신되지 않는 사용자는 비활성 상태로 바뀔 수 있도록 상태를 확인하는 용도의 캐시
•
위치 이동 이력 데이터베이스
•
레디스 pub/sub 서버
3단계: 상세 설계
중요 구성요소별 규모 확장성
•
웹소켓 서버
◦
유상태 서버로 기존 서버를 제거 시에 주의가 필요, 노드 제거 전 기존 연결 종료가 필요
•
클라이언트 초기화
◦
앱 접속 시, 웹소켓 클러스터 내의 서버 가운데 하나와 지속성 웹소켓 연결을 맺음
4단계: 마무리
•
이 설계안의 핵심 컴포넌트는 다음과 같음
◦
웹소켓
◦
레디스
◦
레디스 pub/sub