•
검색어 자동완성은 많은 제품에 중요하게 사용되는 기능으로 이번 장에서는 많이 사용된 검색어 k개를 자동완성하여 출력하는 시스템을 설계해보겠다.
1단계 문제 이해 및 설계 범위 확정
•
검색어 자동완성 서비스를 제공하기 위해 다음과 같은 질문들을 해볼수 있다.
◦
사용자가 입력하는 단어는 자동완성되는 단어의 어느 부분에 해당하는가?
◦
몇 개의 자동완성 검색어가 표시되어야 하는가?
▪
그 몇 개를 고르는 기준은 무엇인가?
◦
맞춤법 검사 기능도 제공해야 하는가?
◦
질의는 무슨 언어를 지원해야 하는가?
◦
특수 문자도 처리를 해주어야 하는가?
◦
얼마나 많은 사용자를 지원해야 하는가?
요구사항
•
이번 예제에서는 다음과 같은 요구사항을 전제로 시스템을 설계한다고 가정하자.
◦
빠른 응답 속도 : 사용자가 검색어를 입력함에 따라 자동완성 검색어도 충분히 빨리 표시되어야 한다.
◦
연관성 : 자동완성되어 출력되는 검색어는 사용자가 입력한 단어와 연관되어야 한다.
◦
정렬 : 시스템의 계산 결과는 인기도 등의 순위 모델에 의해 정렬되어야 한다.
◦
규모 확장성 : 시스템은 많은 트래픽을 감당할 수 있도록 확장 가능해야 한다.
◦
고가용성 : 시스템의 일부에 장애가 발생하거나 느려지거나, 예상치 못한 네트워크 문제가 생겨도 시스템은 사용 가능해야 한다.
개략적 규모 추정
•
DAU는 천만 명이라고 가정한다.
•
평균적으로 한 사용자는 대략 10회의 검색을 수행한다고 가정하자.
•
질의할 때마다 평균적으로 20바이트의 데이터를 입력한다고 가정한다.
◦
인코딩 방식으로는 ASCII를 사용한다고 가정해볼 수 있다.
◦
질의문은 평균적으로 4개 단어로 이루어진다고 가정할 것이며, 각 단어는 평균적으로 5글자로 구성된다고 가정한다.
•
검색창에 글자를 입력할 때마다 클라이언트는 검색어 자동완성 시스템에 요청을 보낸다.
◦
따라서 평균적으로 1회 검색당 20건의 요청이 발생한다.
•
따라서 대략 초당 24,000 건의 질의가 발생할 것이다.
•
기존 검색어를 바탕으로 자동완성을 지원하므로 신규 검색어 역시 존재할 수 있다.
◦
여기선 질의 가운데 대략 20% 정도를 신규 검색어라고 가정한다.
2단계 개략적 설계안 제시 및 동의 구하기
•
개략적으로 보면 시스템은 두 부분으로 나뉜다.
◦
데이터 수집 서비스 : 사용자가 입력한 질의를 실시간으로 수집하는 시스템이다.
◦
질의 서비스 : 주어진 질의에 대해서 다섯 개의 인기 검색어를 정렬하여 반환한다.
데이터 수집 서비스
•
질의문과 사용빈도를 함께 저장하는 빈도 테이블을 만들어 사용할 수 있다.
•
해당 시스템은 질의에 따라 해당 단어의 빈도를 1씩 상승시킬 것이다.
질의 서비스
•
검색 빈도에 따라 데이터를 정렬하므로 특정 단어로 시작하는 쿼리문을 사용한다.
3단계 상세 설계
•
상세히 설계를 위해 다음 내용들을 고려해볼 수 있다.
◦
트라이 자료구조
▪
접두어 최대 길이 제한
▪
노드에 인기 검색어 캐시
◦
데이터 수집 서비스
▪
데이터 분석 서비스 로그
▪
로그 취합 서버
◦
취합된 데이터
◦
작업 서버
◦
트라이 캐시
◦
트라이 데이터베이스
◦
질의 서비스
◦
트라이 연산
▪
트라이 생성
▪
트라이 갱신
▪
검색어 삭제
◦
저장소 규모 확장
4단계 마무리
•
설계 후, 추가적으로 고민해볼 수 있는 사항들은 다음과 같다.
◦
다국어 지원
◦
국가별 인기 검색어 순위
◦
실시간으로 변하는 검색어의 추이를 반영