Foundry
검색어 자동완성 설계
고급
핵심

한 대에 안 들어갈 때

글자로 나누면 크기가 고르지 않다

앞 절에서 두 벌이 필요하다는 것을 봤습니다. 검색어 1억 종류에 노드마다 목록까지 두면 한 대에 들어가지 않을 수 있습니다. 나눠야 한다면 어떻게 나누는지가 이 절입니다.

첫 글자로 나누면 고르지 않다

첫 글자로 나누면 조각의 크기가 크게 달라진다 첫 글자로 나눈 조각 시 로 시작 가 로 시작 쾨 로 시작 조각 수를 늘려도 큰 조각이 쪼개지지 않는다 글자가 아니라 검색량으로 경계를 정한다 경계는 재서 정하고 갱신 때 다시 정한다 유행이 바뀌면 어느 조각이 뜨거워지는지도 바뀐다

가장 단순한 방법은 첫 글자로 나누는 것입니다. 그런데 검색어의 첫 글자는 고르게 퍼져 있지 않습니다. 흔한 글자로 시작하는 조각은 크고 드문 글자로 시작하는 조각은 거의 비어 있습니다.

조각 수를 늘려도 큰 조각이 쪼개지지 않습니다. 첫 글자가 같은 것은 언제나 같은 조각에 있기 때문입니다.

그래서 글자가 아니라 검색량으로 경계를 정합니다.

검색어를 사전 순으로 놓고 누적 검색량이 고르게 되도록 자른다
어느 조각도 한 대에 들어갈 만한 크기가 되게 한다

왜 해시로 나누지 않나

다른 시스템에서는 키를 해시해서 나누는 것이 기본입니다. 여기서는 그러면 안 됩니다.

나누는 기준접두사 검색
사전 순 범위한 접두사의 답이 한 조각에 있다
해시같은 접두사의 단어들이 모든 조각에 흩어진다

해시로 나누면 접두사 하나를 물어볼 때 모든 조각에 물어봐야 합니다. 초당 2만 요청에 조각 수를 곱하면 그 자체로 무너집니다.

접두사 검색은 순서가 의미를 갖는 조회입니다. 그래서 순서를 보존하는 분할을 씁니다.

요청을 어느 조각으로 보내나

경계를 알면 앞 글자 몇 개만 보고 목적지를 정할 수 있습니다. 이 경계표는 작아서 요청을 받는 쪽이 들고 있어도 됩니다.

경계는 갱신할 때 다시 정합니다. 유행이 바뀌면 어느 조각이 뜨거워지는지도 바뀝니다. 통째로 다시 만드는 방식이라 경계를 바꾸는 것도 그때 함께 하면 되고, 따로 재배치할 일이 없습니다.

이것이 앞 절의 결정에서 따라오는 이득입니다. 제자리에서 고치는 구조라면 경계 변경이 데이터 이동을 뜻하지만, 새로 만드는 구조에서는 그냥 다르게 만드는 것입니다.

뜨거운 조각은 나누는 것으로 풀리지 않는다

짧고 인기 있는 접두사는 요청이 몰립니다. 그 접두사가 어느 조각에 있든 그 조각이 뜨거워집니다.

문제대응
조각의 크기가 크다나눈다
조각에 요청이 몰린다사본을 늘린다

두 문제를 같은 수단으로 풀 수 없습니다. 크기는 나눠서 줄이고, 조회 쏠림은 같은 조각을 여러 대에 복사해 나눠 읽습니다. 트라이가 바뀌지 않는 것이므로 사본을 늘리는 데 조율이 필요하지 않습니다.

면접에서 이렇게 나옵니다

Q.트라이를 첫 글자로 나누면 무엇이 문제입니까

조각의 크기가 고르지 않고, 조각 수를 늘려도 큰 조각이 쪼개지지 않습니다.

검색어의 첫 글자는 고르게 퍼져 있지 않습니다. 흔한 글자로 시작하는 조각은 크고 드문 글자로 시작하는 조각은 거의 비어 있습니다.

첫 글자가 같은 것은 언제나 같은 조각에 있으므로, 조각을 더 만들어도 큰 조각은 그대로입니다.

글자가 아니라 검색량으로 경계를 정한다

흔한 실수: 조각 수를 늘려 해결하려는 것. 나누는 기준이 문제인데 개수를 늘리는 것이라, 비어 있는 조각만 더 생깁니다.

Q.해시로 나누면 왜 안 됩니까

같은 접두사의 단어들이 모든 조각에 흩어집니다.

나누는 기준접두사 검색
사전 순 범위한 접두사의 답이 한 조각에 있다
해시접두사 하나에 모든 조각을 물어봐야 한다

초당 2만 요청에 조각 수를 곱하면 그 자체로 무너집니다.

접두사 검색은 순서가 의미를 갖는 조회이므로 순서를 보존하는 분할을 씁니다.

흔한 실수: 해시 분할을 기본값으로 적용하는 것. 해시가 좋은 것은 키를 정확히 지정해 찾는 조회일 때입니다. 범위나 접두사로 찾는 조회에서는 그 장점이 그대로 단점이 됩니다.

Q.조각 경계를 언제 다시 정하시겠습니까

트라이를 새로 만들 때 함께 정합니다.

유행이 바뀌면 어느 조각이 뜨거워지는지도 바뀝니다. 통째로 다시 만드는 방식이라 경계를 바꾸는 것도 그때 하면 되고, 따로 재배치할 일이 없습니다.

제자리에서 고치는 구조: 경계 변경 = 데이터 이동
새로 만드는 구조: 경계 변경 = 다르게 만들기

앞 절에서 통째로 교체하기로 한 결정이 여기서 이자를 돌려줍니다.

흔한 실수: 경계를 처음에 정하고 고정하는 것. 검색어 분포는 계절과 사건에 따라 크게 움직입니다. 한 번 정한 경계는 몇 달 뒤에는 맞지 않습니다.

Q.특정 조각에 요청이 몰리면 어떻게 하시겠습니까

그 조각의 사본을 늘려 나눠 읽습니다. 더 나누는 것으로는 풀리지 않습니다.

문제대응
조각의 크기가 크다나눈다
조각에 요청이 몰린다사본을 늘린다

짧고 인기 있는 접두사는 어느 조각에 있든 그 조각을 뜨겁게 만듭니다. 크기를 줄이는 것과 조회를 나누는 것은 다른 문제입니다.

트라이가 바뀌지 않는 것이므로 사본을 늘리는 데 조율이 필요하지 않습니다.

흔한 실수: 두 문제를 한 수단으로 풀려는 것. 뜨거운 접두사를 더 잘게 나눠도 그 접두사를 물어보는 요청은 여전히 한 곳으로 갑니다. 나누기는 크기의 해법이고 복제는 쏠림의 해법입니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

검색어 자동완성 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.