πŸ““ 11μž₯. λ‰΄μŠ€ ν”Όλ“œ μ‹œμŠ€ν…œ 섀계

onyΒ·2022λ…„ 12μ›” 15일
1

πŸ“š book

λͺ©λ‘ 보기
5/10
post-thumbnail

λ‰΄μŠ€ ν”Όλ“œ λž€?

ν™ˆ νŽ˜μ΄μ§€ 쀑앙에 μ§€μ†μ μœΌλ‘œ μ—…λ°μ΄νŠΈ λ˜λŠ” μŠ€ν† λ¦¬λ“€λ‘œ,
μ‚¬μš©μž μƒνƒœ 정보 μ—…λ°μ΄νŠΈ, 사진, λΉ„λ””μ˜€, 링크, μ•± ν™œλ™(app activity), 그리고 νŽ˜μ΄μŠ€λΆμ—μ„œ νŒ”λ‘œμš°ν•˜λŠ” μ‚¬λžŒλ“€, νŽ˜μ΄μ§€, λ˜λŠ” κ·Έλ£ΉμœΌλ‘œλΆ€ν„° λ‚˜μ˜€λŠ” 'μ’‹μ•„μš”(likes)' 등을 ν¬ν•¨ν•˜λŠ” 것

λΉ„μŠ·ν•œ μœ ν˜•μ˜ 문제둜 페이슀뢁 λ‰΄μŠ€ ν”Όλ“œ, μΈμŠ€νƒ€κ·Έλž¨ ν”Όλ“œ, νŠΈμœ„ν„° νƒ€μž„λΌμΈ 섀계 등이 μžˆλ‹€κ³  ν•œλ‹€.

1단계. 문제 이해 및 섀계 λ²”μœ„ ν™•μ •

  1. λͺ¨λ°”일 μ•±, μ›Ή λͺ¨λ‘ 지원해야함
  2. μƒˆλ‘œμš΄ μŠ€ν† λ¦¬ 올리기 및 보기 λ‹€ κ°€λŠ₯ν•΄μ•Όν•œλ‹€.
  3. ν”Όλ“œ λ‚˜μ—΄μ€ κ°„λ‹¨ν•˜κ²Œ μ‹œκ°„ 흐름 μ—­μˆœ(reverse chronological order)으둜 : μ΅œμ‹ μˆœ
  4. ν•œ λͺ…μ˜ μ‚¬μš©μžλŠ” μ΅œλŒ€ 5000λͺ…μ˜ 친ꡬλ₯Ό κ°€μ§ˆ 수 있음
  5. νŠΈλž˜ν”½ 규λͺ¨λŠ” μ•½ 1,000만λͺ…
  6. ν”Όλ“œμ—λŠ” μ΄λ―Έμ§€λ‚˜ λΉ„λ””μ˜€ μŠ€ν† λ¦¬λ„ 올라올 수 있음

2단계. 개랡적 μ„€κ³„μ•ˆ μ œμ‹œ 및 λ™μ˜ κ΅¬ν•˜κΈ°

1) ν”Όλ“œ λ°œν–‰(feed publishing) κ³Ό

μ‚¬μš©μžκ°€ μŠ€ν† λ¦¬ ν¬μŠ€νŒ…ν•˜λ©΄ ν•΄λ‹Ή 데이터λ₯Ό Cache와 DB에 기둝.
μƒˆ ν¬μŠ€νŒ…μ€ 친ꡬ의 λ‰΄μŠ€ν”Όλ“œμ—λ„ 전솑

2) λ‰΄μŠ€ ν”Όλ“œ 생성(news feed building)

λͺ¨λ“  친ꡬ의 ν¬μŠ€νŒ…μ„ μ‹œκ°„ 흐름 μ—­μˆœμœΌλ‘œ λͺ¨μ•„μ„œ 생성

의 두가지 λΆ€λΆ„μœΌλ‘œ λ‚˜λˆ„μ–΄μ Έ 있음

λ‰΄μŠ€ν”Όλ“œ API

1) ν”Όλ“œ λ°œν–‰ API (HTTP POST ν˜•νƒœλ‘œ μš”μ²­μ„ 보내면 됨)
2) ν”Όλ“œ 읽기 API (HTTP GET ν˜•νƒœλ‘œ μš”μ²­μ„ 보내면 됨)

ν”Όλ“œ λ°œν–‰

λ‰΄μŠ€ν”Όλ“œ 생성

3단계. 상세 섀계

ν”Όλ“œ λ°œν–‰ 흐름 상세 섀계

1) μ›Ή μ„œλ²„
μΈμ¦μ΄λ‚˜ 처리율 μ œν•œ 등이 κΈ°λŠ₯도 μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€.

  1. μ˜¬λ°”λ₯Έ 인증 토큰을 Authorization 헀더에 λ„£κ³  APIλ₯Ό ν˜ΈμΆœν•˜λŠ” μ‚¬μš©μžλ§Œ ν¬μŠ€νŒ… κ°€λŠ₯ν•˜κ²Œ
  2. 슀팸 막고 μœ ν•΄ν•œ μ½˜ν…μΈ κ°€ μ˜¬λΌμ˜€λŠ” κ±Έ 막기 μœ„ν•΄ μ‹œκ°„ λ‹Ή ν¬μŠ€νŒ… 수 μ œν•œ

2) ν¬μŠ€νŒ… 전솑(νŒ¬μ•„μ›ƒ) μ„œλΉ„μŠ€

μ–΄λ–€ μ‚¬μš©μžμ˜ μƒˆ ν¬μŠ€νŒ…μ„ κ·Έ μ‚¬μš©μžμ™€ 친ꡬ 관계에 μžˆλŠ” λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ μ „λ‹¬ν•˜λŠ” κ³Όμ •
νŒ¬μ•„μ›ƒμ—λŠ” 두 가지 λͺ¨λΈμ΄ μžˆλŠ”λ°..

1. μ“°κΈ° μ‹œμ μ— νŒ¬μ•„μ›ƒ(fanout-on-write)ν•˜λŠ” λͺ¨λΈ ν‘Έμ‹œ(push)λͺ¨λΈ

μƒˆλ‘œμš΄ ν¬μŠ€νŒ…μ„ κΈ°λ‘ν•˜λŠ” μ‹œμ μ— λ‰΄μŠ€ ν”Όλ“œ κ°±μ‹ 

μž₯점

  • λ‰΄μŠ€ν”Όλ“œκ°€ μ‹€μ‹œκ°„μœΌλ‘œ κ°±μ‹ λ˜κ³  친ꡬ λͺ©λ‘μ— μžˆλŠ” μ‚¬μš©μžμ—κ²Œ μ¦‰μ‹œ 전솑됨
  • μƒˆ ν¬μŠ€νŒ…μ΄ κΈ°λ‘λ˜λŠ” μˆœκ°„ λ‰΄μŠ€ ν”Όλ“œκ°€ 이미 κ°±μ‹ λ˜λ―€λ‘œ(pre-computed) λ‰΄μŠ€ ν”Όλ“œλ₯Ό 리딩 μ‹œκ°„ 쀄어듬

단점

  • μΉœκ΅¬κ°€ λ§Žμ€ μ‚¬μš©μžμ˜ 경우 친ꡬ λͺ©λ‘μ„ κ°€μ Έμ˜€κ³  κ·Έ λͺ©λ‘μ— μžˆλŠ” μ‚¬μš©μž λͺ¨λ‘μ˜ λ‰΄μŠ€ ν”Όλ“œλ₯Ό κ°±μ‹ ν•˜λŠ” 데 λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ  수 μžˆλ‹€. ν•«ν‚€(hotkey) 문제
  • μ„œλΉ„μŠ€λ₯Ό 자주 μ΄μš©ν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μžμ˜ ν”Όλ“œκΉŒμ§€ 계속 κ°±μ‹ ν•΄μ£Όλ―€λ‘œ μ»΄ν“¨νŒ… μžμ›μ΄ λ‚­λΉ„

2. 읽기 μ‹œμ μ— νŒ¬μ•„μ›ƒ(fanout-on-read)ν•˜λŠ” λͺ¨λΈ ν’€(pull)λͺ¨λΈ

μš”μ²­(on-demand) λͺ¨λΈ. μ‚¬μš©μžκ°€ 본인 ν™ˆνŽ˜μ΄μ§€λ‚˜ νƒ€μž„λΌμΈμ„ λ‘œλ”©ν•˜λŠ” μ‹œμ μ— μƒˆλ‘œμš΄ 포슀트λ₯Ό κ°€μ Έμ˜€κ²Œ 됨.

μž₯점

  • λΉ„ν™œμ„±ν™”λœ μ‚¬μš©μž ν˜Ήμ€ μ„œλΉ„μŠ€μ— 거의 λ‘œκ·ΈμΈν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μžμ˜ κ²½μš°μ—λŠ” 이 λͺ¨λΈμ΄ μœ λ¦¬ν•¨ β†’ 둜그인 μ „κΉŒμ§€λŠ” μ–΄λ–€ μ»΄ν“¨νŒ… μžμ›λ„ μ†Œλͺ¨ν•˜μ§€ μ•ŠμŒ
  • 데이터λ₯Ό 친ꡬ 각각에 ν‘Έμ‹œν•˜λŠ” μž‘μ—…μ΄ ν•„μš” μ—†μœΌλ―€λ‘œ hotkey 문제 λ˜ν•œ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

단점

  • λ‰΄μŠ€ ν”Όλ“œλ₯Ό μ½μ–΄λ“€μ΄λŠ”λ°μ— λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ  μˆ˜λ„ μžˆλ‹€...

κ·Έλž˜μ„œ?
λ‘κ°œλ₯Ό μ„žμ–΄μ„œ 각자의 μž₯점만 얻어가도둝 해보겠닀.

λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžμ— λŒ€ν•΄μ„œλŠ” push λͺ¨λΈμ„ μ‚¬μš©ν•˜κ³ , μΉœκ΅¬λ‚˜ νŒ”λ‘œμ–΄(follower)κ°€ μ•„μ£Ό λ§Žμ€ μ‚¬μš©μžμ˜ κ²½μš°μ—λŠ” νŒ”λ‘œμ–΄λ‘œ ν•˜μ—¬κΈˆ ν•΄λ‹Ή μ‚¬μš©μžμ˜ ν¬μŠ€νŒ…μ„ ν•„μš”ν•  λ•Œ 가져가도둝 ν•˜λŠ” pull λͺ¨λΈμ„ μ‚¬μš©ν•΄μ„œ μ‹œμŠ€ν…œ κ³ΌλΆ€ν•˜λ₯Ό λ°©μ§€ν•΄λ³΄μž

ν”Όλ“œ 읽기 흐름 상세 섀계

μ΄λ―Έμ§€λ‚˜ λΉ„λ””μ˜€ 같은 λ―Έλ””μ–΄ μ½˜ν…μΈ λŠ” CDN 에 μ €μž₯ν•˜μ—¬ 빨리 μ½μ–΄κ°ˆ 수 μžˆλ„λ‘..

μΊμ‹œ ꡬ쑰


CDNμ΄λž€ λ¬΄μ—‡μΈκ°€μš”?

CDN 은 Content Delivery Network 의 μ•½μžλ‘œ μ½˜ν…μΈ  전솑 λ„€νŠΈμ›Œν¬λ₯Ό μ˜λ―Έν•œλ‹€.
ν•œ λ§ˆλ””λ‘œ λ™μ˜μƒ λ“± λ‹€μ–‘ν•œ μ½˜ν…μΈ λ₯Ό λ³΅μž‘ν•œ λ„€νŠΈμ›Œν¬ ν™˜κ²½μ—μ„œ μ‚¬μš©μžμ—κ²Œ μ•ˆμ •μ μœΌλ‘œ 전솑해 μ£ΌλŠ” μ„œλΉ„μŠ€

κ°œμ„ μ œμ•ˆλ„.... κ·Έλž˜μ„œ λ–Όλ†“μ€κ±ΈκΉŒμš”....?


페이슀뢁: λ‰΄μŠ€ν”Όλ“œλŠ” μ΄μš©μžκ°€ μ›ν•˜λŠ” μ½˜ν…μΈ λ₯Ό μ–΄λ–»κ²Œ μ˜ˆμΈ‘ν• κΉŒμš”?

μΉœλ°€λ„ 순으둜 μ˜¬λ €μ£ΌλŠ” 건 μ•Œμ•˜λŠ”λ°..
1. λ°©λŒ€ν•œ μ–‘μ˜ 자료λ₯Ό μ‹Ή 긁은 λ‹€μŒ
2. λ‚΄κ°€ μ’‹μ•„μš”ν•œ 것 기반, μ’‹μ•„μš” 많이 λˆŒλŸ¬μ€€ μ‚¬λžŒ λ“± 정보λ₯Ό λ‹€ λͺ¨μ•„μ„œ
3. 데이터λ₯Ό μŒ“λŠ”λ°
4. 또 λ‚΄κ°€ λŒ“κΈ€λ‘œ ν‘œν˜„μ„ 많이 ν•˜λŠ”μ§€, μ’‹μ•„μš”λ‘œ ν‘œν˜„μ„ 많이 ν•˜λŠ”μ§€ 이런 κ±Έ λΆ„μ„ν•΄μ„œ
5. μš°μ„  μˆœμœ„ 맀긴 λ‹€μŒμ—
6. μ’‹μ•„ν•  λ§Œν•œ κ²Œμ‹œκΈ€λ“€μ„ μœ„λ‘œ μ˜¬λ €μ£Όλ„λ‘ 해놨닀고 함

β†’ 기술적으둜 μ–΄λ–»κ²Œ λŒμ•„κ°€λŠ”μ§€ 고민해보면 μž¬λ°Œμ„ κ±° κ°™μ•„μš” 🐡

profile
파이(Ο€)ν˜• 개발자 🎐🌿🀍

0개의 λŒ“κΈ€