๊ฒ์์ด ์๋์์ฑ (autocomplete, typehead, search-as-you-type, incremental search)์ ๊ดํ ์ด์ผ๊ธฐ.
1๋จ๊ณ. ๋ฌธ์ ์ดํด ๋ฐ ์ค๊ณ ๋ฒ์ ํ์
์๊ตฌ์ฌํญ
- ๋น ๋ฅธ ์๋ต์๋ : ์ฌ์ฉ์๊ฐ ๊ฒ์์ด๋ฅผ ์
๋ ฅํจ์ ๋ฐ๋ผ ์๋์์ฑ ๊ฒ์์ด๋ ์ถฉ๋ถํ ๋นจ๋ฆฌ ํ์๋์ด์ผ ํจ
ํ์ด์ค๋ถ ๊ณต์ ๋ฌธ์ ๊ธฐ์ค ์์คํ ์๋ต์๋๋ 100๋ฐ๋ฆฌ์ด ์ด๋ด์ฌ์ผ ํ๋ค - ์ฐ๊ด์ฑ
- ์ ๋ ฌ : ์์คํ ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ ์ธ๊ธฐ๋(popularity) ๋ฑ์ ์์ ๋ชจ๋ธ(ranking model)์ ์ํด ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ค.
- ๊ท๋ชจ ํ์ฅ์ฑ : ๋ง์ ํธ๋ํฝ์ ๊ฐ๋นํ ์ ์๋๋ก ํ์ฅ ๊ฐ๋ฅํด์ผ ํ๋ค.
- ๊ณ ๊ฐ์ฉ์ฑ : ์์คํ ์ ์ผ๋ถ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋, ๋๋ ค์ง๊ฑฐ๋, ์์์น ๋ชปํ ๋คํธ์ํฌ ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ์์คํ ์ ์ง์ ๊ฐ๋ฅํด์ผ ํจ
๊ฐ๋ต์ ๊ท๋ชจ ์ถ์
- ์ผ๊ฐ ๋ฅ๋ ์ฌ์ฉ์(DAU) ๋ ์ฝ 1000๋ง๋ช
- ํ๊ท ์ ์ผ๋ก ํ ์ฌ์ฉ์ ๋น ๋งค์ผ 10๊ฑด์ ๊ฒ์์ ์ํํ๋ค๊ณ ๊ฐ์
- ์ง์ํ ๋๋ง๋ค ํ๊ท ์ ์ผ๋ก 20๋ฐ์ดํธ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ
- ๊ฒ์์ฐฝ์ ๊ธ์๋ฅผ ์ ๋ ฅํ ๋๋ง๋ค ํด๋ผ์ด์ธํธ๋ ๊ฒ์์ด ์๋์์ฑ ๋ฐฑ์๋์ ์์ฒญ์ ์ ์ก
- ๋๋ต ์ด๋น 24,000๊ฑด์ ์ง์(QPS)๊ฐ ๋ฐ์
- ์ต๋ QPS = QPS * 2 = ์ฝ 48,000
- ์ง์ ๊ฐ์ด๋ฐ 20% ์ ๋๋ ์ ๊ท๊ฒ์์ด๋ผ๊ณ ๊ฐ์ . ๋ฐ๋ผ์ ๋งค์ผ 0.4GB ์ ์ ๊ท ๋ฐ์ดํฐ๊ฐ ์์คํ ์ ์ถ๊ฐ๋๋ค๋ ์๋ฏธ
2๋จ๊ณ. ๊ฐ๋ต์ ์ค๊ณ์ ์ ์ ๋ฐ ๋์ ๊ตฌํ๊ธฐ
๋ฐ์ดํฐ ์์ง ์๋น์ค(data gathering service)
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ง์๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ๋ ์์คํ
๋ฐ์ดํฐ๊ฐ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์๊ฐ ์์คํ
์ ๊ทธ๋ค์ง ๋ฐ๋์งํ์ง ์์ง๋ง ์ค๊ณ์์ ๋ง๋๋ ์ถ๋ฐ์ ์ผ๋ก๋ ๊ด์ฐฎ์
์ง์ ์๋น์ค(query service)
์ฃผ์ด์ง ์ง์์ ๋ค์ฏ ๊ฐ์ ์ธ๊ธฐ ๊ฒ์์ด๋ฅผ ์ ๋ ฌํด ๋ด๋๋ ์๋น์ค
๋ฐ์ดํฐ ์์ง ์๋น์ค
์ง์๋ฌธ๊ณผ ์ฌ์ฉ๋น๋๋ฅผ ์ ์ฅํ๋ ๋น๋ ํ
์ด๋ธ(frequency table)์ด ์๋ค๊ณ ๊ฐ์
์ฒ์์ ํ
์ด๋ธ์ ๋น์ด์๊ณ , ์ฌ์ฉ์๊ฐ ๊ฒ์ํ๋ฉด ์์ฐจ์ ์ผ๋ก ๋น๋ ์์ ์นด์ดํธ๋ฅผ ๋ฃ์
์ง์ ์๋น์ค
SELECT * FROM frequency_table
WHERE query Like 'prefix%'
ORDER BY frequency DESC
LIMIT 5
๋ฐ์ดํฐ ์์ด ์ ์ ๋์ ๋์์ง ์์ ์ค๊ณ์. ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ง์์ง๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๋ชฉ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
3๋จ๊ณ. ์์ธ ์ค๊ณ
ํธ๋ผ์ด(trie) ์๋ฃ๊ตฌ์กฐ, ๋ฐ์ดํฐ ์์ง ์๋น์ค, ์ง์ ์๋น์ค, ๊ท๋ชจ ํ์ฅ์ด ๊ฐ๋ฅํ ์ ์ฅ์, ํธ๋ผ์ด ์ฐ์ฐ
ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ
ํธ๋ผ์ด๋ ๋ฌธ์์ด๋ค์ ๊ฐ๋ตํ๊ฒ ์ ์ฅํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ
- ํธ๋ฆฌ ํํ์ ์๋ฃ๊ตฌ์กฐ
- ์ด ํธ๋ฆฌ์ ๋ฃจํธ ๋ ธ๋๋ ๋น ๋ฌธ์์ด์ ๋ํ๋
- ๊ฐ ๋ ธ๋๋ ๊ธ์(character) ํ๋๋ฅผ ์ ์ฅํ๋ฉฐ, 26๊ฐ(ํด๋น ๊ธ์ ๋ค์์ ๋ฑ์ฅํ ์ ์๋ ๋ชจ๋ ๊ธ์์ ๊ฐ์)์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์์
- ๊ฐ ํธ๋ฆฌ ๋ ธ๋๋ ํ๋์ ๋จ์ด, ๋๋ ์ ๋์ด ๋ฌธ์์ด(prefix string)์ ๋ํ๋
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ง๊ด์ ์ด์ง๋ง ์ต์
์ ๊ฒฝ์ฐ k๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๊ณ ์ ์ฒด ํธ๋ผ์ด๋ฅผ ๋ค ๊ฒ์ํด์ผ ํ๋ ์ผ์ด ๋ฐ์ํ ์๋ ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก๋ 1. ์ ๋์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ํ๊ณผ 2. ๊ฐ ๋
ธ๋์ ์ธ๊ธฐ ๊ฒ์์ด๋ฅผ ์บ์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ ๋์ด ์ต๋ ๊ธธ์ด ์ ํ
์ฌ์ฉ์๊ฐ ๊ฒ์์ฐฝ์ ๊ธด ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๋ ์ผ์ ๊ฑฐ์ ๋๋ฌผ๊ธฐ์ ๊ฒ์์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ํํด๋ ๋๋ค.
๋ ธ๋์ ์ธ๊ธฐ ๊ฒ์์ด ์บ์
๊ฐ ๋
ธ๋์ ์ง์์ด๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ๋ง์ด ํ์ํ๊ฒ ๋๋ค๋ ๋จ์ ๋ ์์ง๋ง..
๋น ๋ฅธ ์๋ต์๋๊ฐ ์์ฃผ ์ค์ํ ๋์๋ ์ด ์ ๋ ์ ์ฅ๊ณต๊ฐ์ ํฌ์ํ ๋งํ ๊ฐ์น๊ฐ ์ถฉ๋ถํจ
๋ฐ์ดํฐ ์์ง ์๋น์ค
ํ์ดํ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋๋ฉด
1. ๋งค์ผ ์์ฒ๋ง ๊ฑด์ ์ง์๊ฐ ์
๋ ฅ๋ ํ
๋ฐ ๊ทธ ๋๋ง๋ค ํธ๋ผ์ด๋ฅผ ๊ฐฑ์ ํ๋ฉด ์ง์ ์๋น์ค๋ ์ฌ๊ฐํ๊ฒ ๋๋ ค์ง ๊ฒ
2. ์ผ๋จ ํธ๋ผ์ด๊ฐ ๋ง๋ค์ด์ง๊ณ ๋๋ฉด ์ธ๊ธฐ ๊ฒ์์ด๋ ๊ทธ๋ค์ง ์์ฃผ ๋ฐ๋์ง ์์ ๊ฒ. ๊ทธ๋์ ํธ๋ผ์ด๋ ๊ทธ๋ ๊ฒ ์์ฃผ ๊ฐฑ์ ํ ํ์๊ฐ ์์
์ ์ด์ ๋ก ๋น์ค์ฉ์ ์ด๊ฒ ๋๋ค.
๋ฐ์ดํฐ ๋ถ์ ์๋น์ค ๋ก๊ทธ
๊ฒ์์ฐฝ์ ์
๋ ฅ๋ ์ง์์ ๊ดํ ์๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณด๊ด๋จ.
์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋ ๋ฟ ์์ ์ ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฉฐ ๋ก๊ทธ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ง ์์.
๋ก๊ทธ ์ทจํฉ ์๋ฒ
๋ฐ์ดํฐ ๋ถ์ ์๋น์ค๋ก ๋ถํฐ ๋์ค๋ ๋ก๊ทธ๋ ์๋ ๋ง๊ณ ๋ฐ์ดํฐ ํ์์ด ์ ๊ฐ๊ฐ์ธ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ
-- ๋ฐ๋ผ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ทจํฉ(aggregation)ํ์ฌ ์์คํ
์ด ์ฝ๊ฒ ์๋นํ ์ ์๊ฒ ํด์ผ ํจ
๋ฐ์ดํฐ ์ทจํฉ์ ์ค์๊ฐ์ฑ์ ๋ํ ์ฒดํฌ๊ฐ ์ค์
์ทจํฉ๋ ๋ฐ์ดํฐ
์์ ์๋ฒ
์ฃผ๊ธฐ์ ์ผ๋ก ๋น๋๊ธฐ์ ์์
(job) ์ ์คํํ๋ ์๋ฒ ์งํฉ
ํธ๋ผ์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ํธ๋ผ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์ญํ ์ ๋ด๋น
ํธ๋ผ์ด ์บ์
๋ถ์ฐ ์บ์ ์์คํ
์ผ๋ก ํธ๋ผ์ด ๋ฐ์ดํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํ์ฌ ์ฝ๊ธฐ ์ฐ์ฐ ์ฑ๋ฅ์ ๋์ด๋ ์ญํ
๋งค์ฃผ ํธ๋ผ์ด DB์ ์ค๋
์ท์ ๋ ์ ๊ฐฑ์
ํธ๋ผ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ง์์ฑ ์ ์ฅ์
ํธ๋ผ์ด DB๋ก ์ฌ์ฉํ ์ ์๋ ์ ํ์ง๋ก๋
- ๋ฌธ์์ ์ฅ์(document store) : ์ฃผ๊ธฐ์ ์ผ๋ก ํธ๋ผ์ด๋ฅผ ์ง๋ ฌํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ ๊ฐ๋ฅ. ๋ชฝ๊ณ ๋๋น(MongoDB) ๊ฐ์ ๋ฌธ์ ์ ์ฅ์๋ฅผ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ ํธ๋ฆฌํ๊ฒ ์ ์ฅ ๊ฐ๋ฅ
- ํค-๊ฐ ์ ์ฅ์ : 1) ํธ๋ผ์ด์ ๋ณด๊ด๋ ๋ชจ๋ ์ ๋์ด๋ฅผ ํด์ ํ ์ด๋ธ ํค๋ก ๋ณํ 2) ๊ฐ ํธ๋ผ์ด ๋ ธ๋์ ๋ณด๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํด์ ํ ์ด๋ธ ๊ฐ์ผ๋ก ๋ณํ
์ง์ ์๋น์ค
- ๊ฒ์ ์ง์๊ฐ ๋ก๋๋ฐธ๋ฐ์๋ก ์ ์ก
- ๋ก๋๋ฐธ๋ฐ์๋ ํด๋น ์ง์๋ฅผ API ์๋ฒ๋ก ๋ณด๋
- API ์๋ฒ๋ ํธ๋ผ์ด ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํด๋น ์์ฒญ์ ๋ํ ์๋์์ฑ ๊ฒ์์ด ์ ์ ์๋ต์ ๊ตฌ์ฑํจ
- ๋ฐ์ดํฐ๊ฐ ํธ๋ผ์ด ์บ์์ ์๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฅผ DB์์ ๊ฐ์ ธ์ ์บ์์ ์ฑ์. ๋ค์์ ๊ฐ์ ์ ๋์ด์ ๋ํ ์ง์๊ฐ ์ค๋ฉด ์บ์์ ๋ณด๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๊ธฐ ์ํด์.. ์บ์ ๋ฏธ์ค(CACHE MISS)๋ ์บ์ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ์บ์ ์๋ฒ์ ์ฅ์ ๊ฐ ์์ด๋ ๋ฐ์ํ ์ ์์
์๊ฐํด ๋ณผ ๋งํ ์ต์ ํ ๋ฐฉ์
- Ajax ์์ฒญ(request) : ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ๊ธฐ ์ํด ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํ ํ์๊ฐ ์๋ค๋ ์ฅ์
- ๋ธ๋ผ์ฐ์ ์บ์ฑ(browser caching) : ์ ์๋ ๊ฒ์์ด๋ค์ ๋ธ๋ผ์ฐ์ ์บ์์ ๋ฃ์ด๋๋ฉด ํ์ ์ง์์ ๊ฒฐ๊ณผ๋ ํด๋น ์บ์์์ ๋ฐ๋ก ๊ฐ์ ธ๊ฐ ์ ์์. ๊ตฌ๊ธ ๊ฒ์ ์์ง์ด ์ด๋ฌํ ์บ์ ๋งค์ปค๋์ฆ์ ์ฌ์ฉ.
- ๋ฐ์ดํฐ ์ํ๋ง(data sampling) : ๋๊ท๋ชจ ์์คํ ์ ๊ฒฝ์ฐ, ๋ชจ๋ ์ง์ ๊ฒฐ๊ณผ๋ฅผ ๋ก๊น ํด ๋์ผ๋ฉด CPU ์์๊ณผ ์ ์ฅ๊ณต๊ฐ์ ๋ค๋ ์์งํ๊ฒ ๋จ. N๊ฐ์ ์์ฒญ ๊ฐ์ด๋ฐ 1๊ฐ๋ง ๋ก๊น
ํธ๋ผ์ด ์ฐ์ฐ
ํธ๋ผ์ด๋ ๊ฒ์์ด ์๋์์ฑ ์์คํ ์ ํต์ฌ ์ปดํฌ๋ํธ
ํธ๋ผ์ด ์์ฑ
์์ ์๋ฒ๊ฐ ๋ด๋นํ๋ฉฐ, ๋ฐ์ดํฐ ๋ถ์ ์๋น์ค์ ๋ก๊ทธ๋ DB๋ก๋ถํฐ ์ทจํฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉ
ํธ๋ผ์ด ๊ฐฑ์
- ๋งค์ฃผ ํ ๋ฒ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ. ์๋ก์ด ํธ๋ผ์ด๋ฅผ ๋ง๋ ๋ค์, ๊ธฐ์กด์ ํธ๋ผ์ด๋ฅผ ๋์ฒด
- ํธ๋ผ์ด์ ๊ฐ ๋ ธ๋๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ. ์ฑ๋ฅ์ด ๋จ์ด์ ธ์ ํธ๋ผ์ด๊ฐ ์์ ๋ ๊ณ ๋ คํด๋ณผ๋งํ ๋ฐฉ์.
๊ฒ์์ด ์ญ์
ํธ๋ผ์ด ์บ์ ์์ ํํฐ ๊ณ์ธต(filter layer)์ ๋๊ณ ๋ถ์ ์ ํ ์ง์์ด๊ฐ ๋ฐํ๋์ง ์๋๋ก ํ๋ ๊ฒ.
ํํฐ ๊ณ์ธต์ ๋๋ฉด ํํฐ ๊ท์น์ ๋ฐ๋ผ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ฅ์
DB์์ ํด๋น ๊ฒ์์ด๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ญ์ ํ๋ ๊ฒ์ ๋ค์ ๋ฒ ์
๋ฐ์ดํธ ์ฌ์ดํด์ ๋น๋๊ธฐ์ ์ผ๋ก ์งํํ๋ฉด ๋จ.
์ ์ฅ์ ๊ท๋ชจ ํ์ฅ
ํธ๋ผ์ด์ ํฌ๊ธฐ๊ฐ ํ ์๋ฒ์ ๋ฃ๊ธฐ์ ๋๋ฌด ํฐ ๊ฒฝ์ฐ์ ๋์ํ ์ ์๋๋ก..
๊ฐ๋จํ๊ฒ ์ฒซ ๊ธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฉ(SHARDING) ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณผ ์ ์์
4. ๋ง๋ฌด๋ฆฌ
์์ด๋์ด
- ์ค๋ฉ์ ํตํด ์์ ๋์์ ๋ฐ์ดํฐ ์์ ์ค์
- ์์๋ชจ๋ธ(Ranking Model)์ ๋ฐ๊พธ์ด ์ต๊ทผ ๊ฒ์์ด์ ๋ณด๋ค ๋์ ๊ฐ์ค์น
- ๋ฐ์ดํฐ๊ฐ ์คํธ๋ฆผ ํํ๋ก ์ฌ ์ ์๋ค๋ ์ . ํ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ์ ์ ๊ณ ๋ ค - ์ด์ ๋ํ ๋ ผ์๋ฅผ ์ํด์๋ ํน์ ํ ๋๋ฉ์ธ ์ง์์ด ํ์