대규모시스템설계기초 ch13
대규모 시스템 설계 기초 ch13. 검색어 자동완성 시스템
1단계. 문제 이해 및 설계 범위 확정
- 빠른 응답 속도 (100ms 이내)
- 연관성
- 정렬
- 규모 확장성 (DAU 천만명)
- 고가용성
2단계. 개략적 설계안 제시 및 동의 구하기
- 시스템 나누기
- 데이터 수집 서비스
- 질의 서비스
- DB의 like 절 + LIMIT 쓸 수 있지만, 대규모 시스템이면 터지기 딱 좋음
3단계. 상세 설계
- 트라이 자료구조
- 문자열을 간략하게 저장할 수 있는 자료구조
- 트리 형태의 자료구조, 루트는 빈 문자열
- 노드에 빈도 정보까지 함께 저장할 것
- 노드에 질의어를 top5 검색어를 캐시해두면 시간 복잡도 O(1)으로 커버 가능
- 데이터 수집 서비스
- 수천만건의 질의가 입력될 때, 트라이를 매번 갱신하면 서비스 부하 너무 큼
- 인기 검색어 만들어지면 트라이 자주 변할 것은 아님. 갱신은 자주할 필요가 없음
- 로그 취합 -> 분류 작업 서버 -> 트라이 갱신도 가능
- 트라이 데이터베이스
- 문서 저장소
- MongoDB와 같은 도큐먼트 디비를 통해 데이터 편하게 저장 가능
- key-value 저장소
- 모든 트라이 데이터를 해시테이블 처럼 대응하여 저장 가능.
- 질의 서비스
- API 서버는 트라이 캐시에서 데이터를 가져와 해당 요청에 대한 자동완성 검색어 제안 응답 구성
- 브라우저 캐싱을 통해 한동안 자동완성 똑같은 쿼리 안날리도록 조치
- 트라이 연산
- 트라이는 DB, 로그 등에서 취합한 데이터 사용
- 검색어 삭제: 필터 계층을 두고 부적절한 질의어가 반환되지 않도록 하기
- 저장소 규모 확장
- 샤딩을 통해서 특정 노드들을 분산시킬 수 있음.
- 여기에서도 유명인사 문제가 발생할 수 있어, 과거의 데이터를 통해 노드를 쪽수별로 잘 분산할 수 있도록 샤딩 필요
4단계. 마무리
- 다국어 지원은 무조건 유니코드
- 국가별로 다른 검색어라면, 국가별 트라이
- 실시간 검색어를 자동완성에 구축하려면 어떻게?
설계)