Design Ad Click Event Aggregation System
์๊ตฌ์ฌํญ
ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๋ก๊ทธ ํ์ผ์ ๋์ ์ถ๊ฐ๋๋ ๋ก๊ทธ ํ์ผ ํํ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋จ
์ธ ๊ฐ์ง ์ง์ ์ง์
ํน์ ๊ด๊ณ ์ ๋ํ ์ง๋ M๋ถ๊ฐ์ ํด๋ฆญ ์ด๋ฒคํธ ์
ํน์ ๊ธฐ๊ฐ ๋์ ๊ฐ์ฅ ๋ง์ด ํด๋ฆญ๋ ๊ด๊ณ N๊ฐ
ip / user_id / country ๋ฑ ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ 2๊ฐ์ ์ง์ ๊ฒฐ๊ณผ ํํฐ๋ง
์ฃ์ง ์ผ์ด์ค ์กด์ฌ
๋ฆ๊ฒ ๋์ฐฉํ๋ ์ด๋ฒคํธ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์กด์ฌ
์ค๋ณต๋ ์ด๋ฒคํธ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์กด์ฌ
์์คํ ์ผ๋ถ ๋ค์ด ๊ฐ๋ฅ์ฑ ์กด์ฌ
์ง๊ณ ์ฒ๋ฆฌ๋ ์ ๋ถ ๋ด์ ์๋ฃ ํ์
๋งค์ผ 10์ต ๊ฐ์ ๊ด๊ณ ํด๋ฆญ ๋ฐ์๊ณผ ๋งค์ผ 200๋ง ํ์ ๊ด๊ณ ๊ฒ์ฌ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ ๋ ์๋์ ๊ฐ์ด ์ถ์ ํ ์ ์๋ค.
๊ด๊ณ ํด๋ฆญ QPS = 10์ต / (24 * 3600) = 11574
์ต๋ QPS = 11574 * 5 = 57870
์ผ์ผ ์ ์ฅ์ ์๊ตฌ๋ = 0.1KB * 10์ต = 100GB(๊ด๊ณ ํด๋ฆญ ์ด๋ฒคํธ ํ๋๋น 0.1KB๋ผ๊ณ ๊ฐ์ )
์ง์ API ์ค๊ณ
์์์ ์ธ๊ธ ๋ ์ธ ๊ฐ์ง ์ง์๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ผ์ ๊ธฐ๊ฐ ๋์ ๊ฐ ad_id๋ฐ ๋ฐ์ํ ํด๋ฆญ ์ ์ง๊ณ
์ผ์ ๊ธฐ๊ฐ ๋์ ๊ฐ์ฅ ๋ง์ด ํด๋ฆญ๋ N๊ฐ์ ad_id ๋ชฉ๋ก ๋ฐํ
๋ค์ํ ์์ฑ์ ๊ธฐ์ค์ผ๋ก ์ง๊ณ ๊ฒฐ๊ณผ ํํฐ๋ง
์ ์ธ ๊ฐ์ง ์ง์๋ ๋ ๊ฐ์ API๋ก ์ง์ํ ์ ์๋ค.(ํํฐ๋ง์ ํธ์ถ ์ธ์๋ฅผ ํตํด ์ง์)
API 1: ํน์ ๊ธฐ๊ฐ ๋์ ad_id๋ณ ํด๋ฆญ ์ ์ง๊ณ
endpoint:
GET /ads/{:ad_id}/aggregated_count
์ธ์
from
: ์ง๊ณ ์์ ์๊ฐto
: ์ง๊ณ ์ข ๋ฃ ์๊ฐfilter
: ํํฐ๋ง ์ ๋ต ์๋ณ์
๋ฐํ ์๋ต
ad_id
: ๊ด๊ณ ์๋ณ์count
: ์ง๊ณ๋ ํด๋ฆญ ํ์
API 2: ํน์ ๊ธฐ๊ฐ ๋์ ๊ฐ์ฅ ๋ง์ด ํด๋ฆญ๋ N๊ฐ์ ad_id ๋ชฉ๋ก ๋ฐํ
endpoint:
GET /ads/popular
์ธ์
count
: ์์ N๊ฐ ์window
: ๋ถ ๋จ์๋ก ํํ๋ ์ง๊ณ ์๋ ํฌ๊ธฐfilter
: ํํฐ๋ง ์ ๋ต ์๋ณ์
๋ฐํ ์๋ต
ad_ids
: ๊ด๊ณ ์๋ณ์ ๋ชฉ๋ก
๋ฐ์ดํฐ ๋ชจ๋ธ
๊ด๊ณ ํด๋ฆญ ์ด๋ฒคํธ ์ง๊ณ ์์คํ ์ด ๋ค๋ฃจ๋ ๋ฐ์ดํฐ๋ ์์ ๋ฐ์ดํฐ์ ์ง๊ณ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
์์ ๋ฐ์ดํฐ
ad_id
/click_timestamp
/user_id
/ip
/country
๋ฑ ํด๋ฆญ ์ด๋ฒคํธ์ ๋ํ ์์ฑํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๋ก๊ทธ ํ์ผ์ ๋์ ์ถ๊ฐ๋๋ ํํ๋ก ์ ๋ ฅ๋จ
์ง๊ณ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ
ad_id
/click_minute
/count
/filter_id
๋ฑ ์ง๊ณ ๊ฒฐ๊ณผ์ ๋ํ ์์ฑ์์ ๋ฐ์ดํฐ๋ฅผ ๋งค๋ถ ์ง๊ณํ์ฌ ์ ์ฅํ๋ ํํ๋ก ์ ์ฅ๋จ
์์ ๋ฐ์ดํฐ๋ ์ ์ ์๋ฏ์ด ๋ง๋ํ ๋ฐ์ดํฐ ์ฉ๋์ ์ฐจ์งํ๊ฒ ๋์ด ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ง๋ง, ์์ ๋ฐ์ดํฐ์ ์ง๊ณ ๋ฐ์ดํฐ ๋ ๋ค ์ ์ฅํ๋ ๊ฒ์ด ์ข๋ค.
๋ฌธ์ ๋ฐ์ ์ ์์ ๋ฐ์ดํฐ๋ก ๋๋ฒ๊น ๋ฐ ๋ณต๊ตฌ ๊ฐ๋ฅ
์ง๊ณ ๋ฐ์ดํฐ๋ ๋น ๋ฅธ ์ง์๋ฅผ ์ํด ์ฌ์ฉ
์ค๋๋ ์์ ๋ฐ์ดํฐ๋ ๋์ข ์ ์ฅ์(cold storage)๋ก ์ฎ๊ฒจ ๋น์ฉ ์ ๊ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ ์์ ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ๊ณ ๋ คํ์ฌ ์ ํํ ์ ์๋ค.
๋ฐ์ดํฐ์ ํํ(๊ด๊ณํ ๋ฐ์ดํฐ / ๋ฌธ์ ๋ฐ์ดํฐ / ์ด์ง ๋ํ ๊ฐ์ฒด(BLOB) ๋ฑ)
์ฝ๊ธฐ ์ค์ฌ / ์ฐ๊ธฐ ์ค์ฌ / ๋ ๋ค
ํธ๋์ญ์ ์ง์ ์ ๋ฌด
์ง์ ๊ณผ์ ์์ SUM / COUNT ๊ฐ์ ๋ถ์ ์ฒ๋ฆฌ ํจ์์ ์ฆ์ ์ฌ์ฉ ์ฌ๋ถ
์์ ๋ฐ์ดํฐ์ ์ง๊ณ ๋ฐ์ดํฐ์ ํน์ฑ์ ๊ณ ๋ คํ ๋, ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ํํ ์ ์๋ค.
์์ ๋ฐ์ดํฐ: ์ฐ๊ธฐ ๋ฐ ์๊ฐ ๋ฒ์ ์ง์์ ์ต์ ํ๋ ์์คํ ์ธ ์นด์ฐ๋๋ผ(Cassandra) ์ฌ์ฉ
์ผ๋ฐ์ ์ธ ์์ ์์ ์์ ๋ฐ์ดํฐ์ ๋ํ ์ง์๊ฐ ํ์ ์์ผ๋, ์ฌ์ฉ์ ๋ถ์ ๋ฑ์ ์ฐ๊ตฌํ๋ ๊ฒฝ์ฐ์๋ ํ์ํ ์ ์์
์ต๋ QPS๊ฐ 57870์ ์ฐ๊ธฐ ์ค์ฌ ์์คํ
์ง๊ณ ๋ฐ์ดํฐ: ์ฐ๊ธฐ ๋ฐ ์๊ฐ ๋ฒ์ ์ง์์ ์ต์ ํ๋ ์์คํ ์ธ ์นด์ฐ๋๋ผ(Cassandra) ์ฌ์ฉ
์๊ณ์ด ๋ฐ์ดํฐ
์ฝ๊ธฐ ์ฐ์ฐ / ์ฐ๊ธฐ ์ฐ์ฐ ๋ ๋ค ๋ง์ด ์ฌ์ฉ
๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๋ฐ์ดํฐ์ ๊ฐ์ ์ด์ ๋ก ์นด์ฐ๋๋ผ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ๋ต์ ์ค๊ณ
๋ฐ์ดํฐ์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฌ๊ฐ๊ฒ ๋๋ค.
์ ๋ ฅ: ๋ก๊ทธ ๋ชจ๋ํฐ์ ๋ก๊ทธ ํ์ผ๋ค์ด ์ง๊ณ
ํ๋ก์ธ์ค: ์์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ์ฌ ์ ์ฅ
์ ์ฅ: ์ง๊ณ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
์ง์: API๋ฅผ ํตํด ์ง์
์ ํ๋ฆ์ ๋๊ธฐ์์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ค๋ฉด, ๊ธ์์ค๋ฌ์ด ํธ๋ํฝ ์ฆ๊ฐ์ ๋์ํ๊ธฐ ์ด๋ ค์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง ํ๋ฅผ ๋์ ํ๋ ๊ฒ์ด ์ข๋ค.
์ ์ค๊ณ์์ ๋ณด๋ฉด ๋ ๊ฐ์ ๋ฉ์์ง ํ๋ก ๋ถ๋ฆฌํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ก ๊ธฐ๋กํ์ง ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ด๋ ์ ํํ๊ฒ ํ ๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํจ์ด๋ค.
์์ธ ์ค๊ณ
์๊ฐ
์ง๊ณ๋ฅผ ํ๊ธฐ ์ํด์ ํ์์คํฌํ๊ฐ ํ์ํ๋ค. ํ์์คํฌํ๋ ๋ ๊ฐ์ง ์์น์์ ๋ง๋ค์ด ์ง ์ ์๋ค.
์ด๋ฒคํธ ๋ฐ์ ์๊ฐ: ๊ด๊ณ ํด๋ฆญ์ด ๋ฐ์ํ ์๊ฐ
์ฒ๋ฆฌ ์๊ฐ: ์ง๊ณ ์๋ฒ๊ฐ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์์คํ ์๊ฐ
๋คํธ์ํฌ ์ง์ฐ์ด๋ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ ํ๊ฒฝ๋๋ฌธ์ ๋ ์๊ฐ ์ฌ์ด์ ๊ฒฉ์ฐจ๊ฐ ์ปค์ง ์ ์์ผ๋ฉฐ, ์ง๊ณ์ ์ด๋ค ์๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋ผ ์ฅ๋จ์ ์ด ์กด์ฌํ๋ค.
์ด๋ฒคํธ ๋ฐ์ ์๊ฐ
๊ด๊ณ ํด๋ฆญ ์์ ์ ๋ ์ ํํ ํ์ ๊ฐ๋ฅ
ํด๋ผ์ด์ธํธ ์์ฑ ํ์์คํฌํ์ ์์กดํ๋ ๋ฐฉ์์ผ๋ก, ํด๋ผ์ด์ธํธ ์ค์ ์๊ฐ์ด ์๋ชป๋๊ฑฐ๋ ์ ์ฑ ํด๋ผ์ด์ธํธ์ ์ํด ์กฐ์๋ ์ ์์
์ฒ๋ฆฌ ์๊ฐ
ํด๋ผ์ด์ธํธ ์ค์ ์๊ฐ์ ์์กดํ์ง ์์
๋คํธ์ํฌ ์ง์ฐ์ด๋ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ ํ๊ฒฝ ๋๋ฌธ์ ์๊ฐ์ด ๋ฌ๋ผ ์ง๊ณ ๊ฒฐ๊ณผ๊ฐ ๋ถ์ ํํด์ง
์ ๋ฌ ๋ณด์ฅ
์ง๊ณ ๊ฒฐ๊ณผ๋ ๊ณผ๊ธ ๋ฑ์ ํ์ฉ๋ ์ ์์ด ๋ฐ์ดํฐ ์ ํ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ด ์์ฃผ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์๋ ๋ ๊ฐ์ง๋ฅผ ๋ณด์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
์ด๋ฒคํธ ์ค๋ณต ์ฒ๋ฆฌ ํํผ ๋ฐฉ๋ฒ
๋ชจ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ณด์ฅ ๋ฐฉ๋ฒ
์นดํ์นด์ ๊ฐ์ ๋ฉ์์ง ํ๋ ์ต๋ ํ ๋ฒ / ์ต์ ํ ๋ฒ / ์ ํํ ํ ๋ฒ ์ ๋ฌ ๋ฐฉ์์ ์ง์ํ๋ฉฐ, ์ด ์ค ์ ํํ ํ ๋ฒ ์ ๋ฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ฐ์ดํฐ ์ค๋ณต ์ ๊ฑฐ
๊ฐ์ฅ ํํ๊ฒ ๋ฐ์ ํ ์ ์๋ ์ด์ ๊ฐ์ด๋ฐ ํ๋๋ ์ค๋ณต๋ ๋ฐ์ดํฐ๋ก, ์๋ ๋ ๊ฐ์ง ์ํฉ์์ ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ ์ฑ ํด๋ผ์ด์ธํธ: ํ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ ์์ ์ธ ์๋๋ก ์ฌ๋ฌ ๋ฒ ์ ์ก
์ค๋ณต ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ด๊ณ ์ฌ๊ธฐ / ์ํ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ๋์ด ์ด๋ฅผ ๋ฐฉ์ง
์๋ฒ ์ฅ์ : ์ง๊ณ ๋์ค ์ง๊ณ ์๋น์ค ๋ ธ๋์์ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ฒคํธ ๋ฉ์์ง์ ๋ํด ์๋ต ๋ฐ์ง ๋ชปํ์ฌ ๋ค์ ์ ์กํ์ฌ ์ฌ์ฐจ ์ง๊ณ
์คํ์ ์ ์ ์ฅํ์ฌ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ๊ณ , ์ฒ๋ฆฌ๋์ง ์์ ์ด๋ฒคํธ๋ง ์ฒ๋ฆฌํ ์ ์๋๋ก ํจ
์ฐธ๊ณ ์๋ฃ
Last updated
Was this helpful?