Design News Feed System

μš”κ΅¬μ‚¬ν•­

  • λͺ¨λ°”일 / μ›Ή λͺ¨λ‘ 지원

  • ν”Όλ“œ νŽ˜μ΄μ¦ˆμ— μƒˆλ‘œμš΄ μŠ€ν† λ¦¬ 생성 및 쑰회 κΈ°λŠ₯

  • μŠ€ν† λ¦¬μ—” 이미지 ν˜Ήμ€ λΉ„λ””μ˜€ 포함 κ°€λŠ₯

  • μ‹œκ°„ 흐름 μ—­μˆœμœΌλ‘œ μŠ€ν† λ¦¬ μ •λ ¬

  • ν•œ λͺ…μ˜ μ‚¬μš©μžλŠ” μ΅œλŒ€ 5,000λͺ…μ˜ νŒ”λ‘œμ›Œλ₯Ό κ°€μ§ˆ 수 있음

  • DAU 1,000만λͺ…

κΈ°λŠ₯ μ •μ˜

μœ„μ™€ 같은 μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±ν•˜κΈ° μœ„ν•΄ 크게 두 가지 κΈ°λŠ₯을 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

  • ν”Όλ“œ λ°œν–‰: μ‚¬μš©μžκ°€ μŠ€ν† λ¦¬κ°€ ν¬μŠ€νŒ… μ‹œ ν•΄λ‹Ή 데이터λ₯Ό μΊμ‹œμ™€ λ°μ΄ν„°λ² μ΄μŠ€μ— 기둝

    • μƒˆ ν¬μŠ€νŒ…μ€ νŒ”λ‘œμ›Œμ˜ λ‰΄μŠ€ ν”Όλ“œμ—λ„ 전솑

  • λ‰΄μŠ€ ν”Όλ“œ 생성: λͺ¨λ“  친ꡬ의 ν¬μŠ€νŒ…μ„ μ‹œκ°„ 흐름 μ—­μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 제곡

μœ„ κΈ°λŠ₯을 API λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μ„€κ³„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • ν”Όλ“œ λ°œν–‰ API POST /v1/me/feed

    • body: ν¬μŠ€νŒ… λ‚΄μš©

    • 헀더: 인증을 μœ„ν•œ Authorization 헀더 토큰

  • ν”Όλ“œ 읽기 API GET /v1/me/feed

    • 헀더: 인증을 μœ„ν•œ Authorization 헀더 토큰

상세 섀계

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

ν”Όλ“œ λ°œν–‰ κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•œ μ‹œμŠ€ν…œμ€ λŒ€λž΅μ μœΌλ‘œ μ•„λž˜μ™€ 같이 ꡬ성할 수 μžˆλ‹€.

λ””λ°”μ΄μŠ€ ──> λ‘œλ“œλ°ΈλŸ°μ„œ ──> μ›Ήμ„œλ²„ ──> ν¬μŠ€νŒ… μ €μž₯ μ„œλΉ„μŠ€ ──> ν¬μŠ€νŒ… μΊμ‹œ ──> ν¬μŠ€νŒ… λ°μ΄ν„°λ² μ΄μŠ€
                            β”œβ”€β”€ ν¬μŠ€νŒ… 전솑 μ„œλΉ„μŠ€ ──> μ‚¬μš©μž 관계 κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€ 
                            └── μ•Œλ¦Ό μ„œλΉ„μŠ€      β”œβ”€> μ‚¬μš©μž 정보 μΊμ‹œ ──> μ‚¬μš©μž λ°μ΄ν„°λ² μ΄μŠ€
                                              └─> λ©”μ‹œμ§€ 큐 ──> ν¬μŠ€νŒ… 전솑 μž‘μ—… μ„œλ²„ ──> λ‰΄μŠ€ ν”Όλ“œ μΊμ‹œ
  • μ›Ή μ„œλ²„: HTTP μš”μ²­μ„ λ‚΄λΆ€ μ„œλΉ„μŠ€λ‘œ 쀑계

    • 인증: Authorization 헀더 토큰을 ν™•μΈν•˜μ—¬ μ‚¬μš©μž 인증

    • 처리율 μ œν•œ: μœ ν•΄ν•œ 컨텐츠 방지 및 νŠΉμ • μ‚¬μš©μžκ°€ 올릴 수 μžˆλŠ” ν¬μŠ€νŒ… 수 μ œν•œ

  • ν¬μŠ€νŒ… μ €μž₯ μ„œλΉ„μŠ€: μƒˆ ν¬μŠ€νŒ…μ„ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μΊμ‹œμ— μ €μž₯

  • ν¬μŠ€νŒ… 전솑 μ„œλΉ„μŠ€: μƒˆ ν¬μŠ€νŒ…μ„ ν•΄λ‹Ή μ‚¬μš©μžμ˜ μ—°κ΄€ 관계에 μžˆλŠ” λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ 전달

    • λ‰΄μŠ€ ν”Όλ“œ μΊμ‹œμ— μ €μž₯ν•΄ λΉ λ₯΄κ²Œ 쑰회 ν•  수 μžˆλ„λ‘ 함

  • μ•Œλ¦Ό μ„œλΉ„μŠ€: νŒ”λ‘œμ›Œμ—κ²Œ μƒˆ ν¬μŠ€νŒ… μ•Œλ¦Ό μ—­ν• 

ν¬μŠ€νŒ… 전솑 μ„œλΉ„μŠ€μ—μ„œ μƒˆ ν¬μŠ€νŒ…μ„ ν•΄λ‹Ή μ‚¬μš©μžμ˜ μ—°κ΄€ 관계에 μžˆλŠ” λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ μ „λ‹¬ν•˜λŠ” 것을 νŒ¬μ•„μ›ƒμ΄λΌκ³  ν•˜λŠ”λ°, νŒ¬μ•„μ›ƒ λͺ¨λΈμ—λŠ” μ“°κΈ° μ‹œμ  νŒ¬μ•„μ›ƒκ³Ό 읽기 μ‹œμ  νŒ¬μ•„μ›ƒ 두 가지 μ‘΄μž¬ν•œλ‹€.

  • μ“°κΈ° μ‹œμ  νŒ¬μ•„μ›ƒ(ν‘Έμ‹œ λͺ¨λΈ): μƒˆ ν¬μŠ€νŒ…μ„ μ €μž₯ν•˜λŠ” μ‹œμ μ— λ‰΄μŠ€ ν”Όλ“œ κ°±μ‹ 

    • λ‰΄μŠ€ ν”Όλ“œκ°€ μ‹€μ‹œκ°„μœΌλ‘œ κ°±μ‹ λ˜μ–΄ μ‚¬μš©μžκ°€ λ‰΄μŠ€ ν”Όλ“œ 쑰회 μ‹œμ μ— λΉ λ₯΄κ²Œ 쑰회 κ°€λŠ₯

    • μ‚¬μš©μž λͺ¨λ‘μ˜ λ‰΄μŠ€ ν”Όλ“œλ₯Ό κ°±μ‹ ν•˜κΈ° λ•Œλ¬Έμ— λ§Žμ€ μ‹œκ°„ μ†Œμš” 문제 κ°€λŠ₯성이 μ‘΄μž¬ν•˜λ©° 자주 μ΄μš©ν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μžκΉŒμ§€ λΆˆν•„μš”ν•˜κ²Œ κ°±μ‹ λ˜λŠ” λ¬Έμ œκ°€ 있음

  • 읽기 μ‹œμ  νŒ¬μ•„μ›ƒ(ν’€ λͺ¨λΈ): λ‰΄μŠ€ ν”Όλ“œλ₯Ό μ‘°νšŒν•˜λŠ” μ‹œμ μ— λ‰΄μŠ€ ν”Όλ“œ κ°±μ‹ 

    • 자주 μ΄μš©ν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μžμ˜ λ‰΄μŠ€ ν”Όλ“œ 갱신을 방지

    • μ‚¬μš©μžκ°€ λ‰΄μŠ€ ν”Όλ“œ 쑰회 μ‹œμ μ— κ°±μ‹ λ˜κΈ° λ•Œλ¬Έμ— λ‰΄μŠ€ ν”Όλ“œ 쑰회 μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆ 수 있음

μœ„ 두 가지 방법을 ν˜Όν•©ν•˜μ—¬ 각 μž₯점을 μ·¨ν•˜λ„λ‘ 섀계할 수 μžˆλ‹€.

  • λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μž: λ‰΄μŠ€ ν”Όλ“œλ₯Ό λΉ λ₯΄κ²Œ μ‘°νšŒν•  수 μžˆλŠ” 것이 μ€‘μš”ν•˜λ―€λ‘œ μ“°κΈ° μ‹œμ  νŒ¬μ•„μ›ƒ(ν‘Έμ‹œ λͺ¨λΈ) μ‚¬μš©

  • νŒ”λ‘œμ›Œκ°€ μ•„μ£Ό λ§Žμ€ μ‚¬μš©μž: νŒ”λ‘œμ›Œλ‘œ ν•˜μ—¬κΈˆ ν•΄λ‹Ή μ‚¬μš©μžμ˜ ν¬μŠ€νŒ…μ„ ν•„μš”ν•  λ•Œ μ‘°νšŒν•˜λŠ” λ°©μ‹μœΌλ‘œ 읽기 μ‹œμ  νŒ¬μ•„μ›ƒ(ν’€ λͺ¨λΈ) μ‚¬μš©

  • μΆ”κ°€μ μœΌλ‘œ μ•ˆμ • ν•΄μ‹œλ₯Ό 톡해 μš”μ²­κ³Ό 데이터λ₯Ό κ³ λ₯΄κ²Œ λΆ„μ‚°ν•˜μ—¬ 처리(νŠΉμ • 데이터가 많이 μš”μ²­λ˜μ–΄ λΆ€ν•˜κ°€ μ§‘μ€‘λ˜λŠ” 것을 방지)

두 방법을 ν˜Όν•©ν•˜κ²Œ 된 νŒ¬μ•„μ›ƒ μ„œλΉ„μŠ€λŠ” λ‹€μŒκ³Ό 같이 λ™μž‘ν•˜κ²Œ λœλ‹€.

  1. μ‚¬μš©μž 관계 κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 친ꡬ ID λͺ©λ‘ 쑰회

  2. μ‚¬μš©μž 정보 μΊμ‹œμ—μ„œ μΉœκ΅¬λ“€ 정보 쑰회

  3. 친ꡬ λͺ©λ‘κ³Ό μƒˆ μŠ€ν† λ¦¬ ν¬μŠ€νŒ… IDλ₯Ό λ©”μ‹œμ§€ 큐에 전달

  4. ν¬μŠ€νŒ… 전솑 μž‘μ—… μ„œλ²„μ—μ„œ λ©”μ‹œμ§€ νμ—μ„œ λ©”μ‹œμ§€λ₯Ό 가져와 λ‰΄μŠ€ ν”Όλ“œ μΊμ‹œμ— μ €μž₯

    • λ‰΄μŠ€ ν”Όλ“œ μΊμ‹œλŠ” <post_id, user_id> μˆœμ„œμŒ μ €μž₯

    • μ‚¬μš©μžκ°€ ν”Όλ“œ μ „λΆ€λ₯Ό λ³΄λŠ” κ²½μš°λŠ” λ“œλ¬ΌκΈ° λ•Œλ¬Έμ— μΊμ‹œμ˜ 크기λ₯Ό μ œν•œν•˜μ—¬ 졜근 ν¬μŠ€νŒ…λ§Œ μ €μž₯

    • λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•˜κΈ° μœ„ν•΄ id만 μ €μž₯ν•˜κ³ , μ‹€μ œ λ°μ΄ν„°λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°€μ Έμ˜΄

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

μ‚¬μš©μžκ°€ λ³΄λŠ” λ‰΄μŠ€ ν”Όλ“œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μ‹œμŠ€ν…œμ€ λŒ€λž΅μ μœΌλ‘œ μ•„λž˜μ™€ 같이 ꡬ성할 수 μžˆλ‹€.

λ””λ°”μ΄μŠ€ <──> λ‘œλ“œλ°ΈλŸ°μ„œ ──> μ›Ήμ„œλ²„(μ—¬λŸ¬ λŒ€) ──> λ‰΄μŠ€ ν”Όλ“œ μ„œλΉ„μŠ€ ──> λ‰΄μŠ€ ν”Όλ“œ μΊμ‹œ
        └─> CDN                                       β”œβ”€> μ‚¬μš©μž 정보 μΊμ‹œ ──> μ‚¬μš©μž λ°μ΄ν„°λ² μ΄μŠ€
                                                      └─> ν¬μŠ€νŒ… μΊμ‹œ ──> ν¬μŠ€νŒ… λ°μ΄ν„°λ² μ΄μŠ€
  1. μ‚¬μš©μžκ°€ λ‰΄μŠ€ ν”Όλ“œ 쑰회 μš”μ²­

  2. λ‘œλ“œλ°ΈλŸ°μ„œλŠ” μ›Ή μ„œλ²„ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ μš”μ²­ 전달

  3. λ‰΄μŠ€ ν”Όλ“œ μ„œλΉ„μŠ€μ—μ„œ λ‰΄μŠ€ ν”Όλ“œ μΊμ‹œμ— μ €μž₯된 ν¬μŠ€νŒ… ID λͺ©λ‘ 쑰회

  4. λ‰΄μŠ€ ν”Όλ“œμ— ν‘œμ‹œν•  μ‚¬μš©μž 이름 / μ‚¬μš©μž 사진 / ν¬μŠ€νŒ… 컨텐츠 / 이미지 등을 μ‚¬μš©μž μΊμ‹œμ™€ ν¬μŠ€νŒ… μΊμ‹œμ—μ„œ 쑰회

  5. 쑰회된 λ°μ΄ν„°λ“€λ‘œ λ‰΄μŠ€ ν”Όλ“œ 생성

  6. μƒμ„±λœ λ‰΄μŠ€ ν”Όλ“œλ₯Ό μ‚¬μš©μžμ—κ²Œ 전달

μΊμ‹œ

μΊμ‹œλŠ” λ‰΄μŠ€ ν”Όλ“œ μ‹œμŠ€ν…œμ˜ 핡심 μ»΄ν¬λ„ŒνŠΈ 쀑 ν•˜λ‚˜λ‘œ, λ‹€μŒκ³Ό 같은 정보λ₯Ό μ €μž₯ν•  수 μžˆλ‹€.

  • λ‰΄μŠ€ ν”Όλ“œ: λ‰΄μŠ€ ν”Όλ“œ ID 보관

  • 컨텐츠: ν¬μŠ€νŒ… 데이터 보관, 인기 컨텐츠와 일반 컨텐츠λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ €μž₯

  • μ†Œμ…œ κ·Έλž˜ν”„: νŒ”λ‘œμ›Œ / νŒ”λ‘œμž‰ 관계 보관

  • 행동: μ‚¬μš©μž 행동(μ’‹μ•„μš”, λŒ“κΈ€ λ“±) 보관

  • 횟수: μ’‹μ•„μš” / λŒ“κΈ€ 수 / νŒ”λ‘œμ›Œ 수 λ“± 보관

참고자료

Last updated