Skip to content

Latest commit

Β 

History

History
66 lines (45 loc) Β· 4.3 KB

File metadata and controls

66 lines (45 loc) Β· 4.3 KB

πŸ“„ [κΈ°λŠ₯ λͺ…μ„Έμ„œ] Hub Server λΈŒλ‘œλ“œμΊμŠ€νŒ… μž¬μ‹œλ„ 및 μ—λŸ¬ 처리 μ •μ±…

1. κ°œμš”

  • λͺ©ν‘œ: Kafka Consumer(Server 2)κ°€ λ‹€μˆ˜μ˜ Leaf Node(Server 3, 4, 5...)둜 λ©”μ‹œμ§€λ₯Ό μ „νŒŒ(Broadcasting)ν•  λ•Œ, λΆˆν•„μš”ν•œ μž¬μ‹œλ„λ‘œ μΈν•œ μ‹œμŠ€ν…œ λΆ€ν•˜λ₯Ό λ°©μ§€ν•˜κ³ , 볡ꡬ κ°€λŠ₯ν•œ μ—λŸ¬λ§Œ μ„ λ³„μ μœΌλ‘œ μž¬μ‹œλ„ν•˜μ—¬ 전솑 성곡λ₯ μ„ 높인닀.
  • 핡심 원칙: Fail Fast (λΉ λ₯Έ μ‹€νŒ¨) & Smart Retry (λ˜‘λ˜‘ν•œ μž¬μ‹œλ„)

2. μ—λŸ¬ μœ ν˜•λ³„ λŒ€μ‘ μ •μ±… (Retry Policy Matrix)

Leaf Nodeμ™€μ˜ 톡신 μ‹œ λ°œμƒν•  수 μžˆλŠ” μ—λŸ¬λ₯Ό 4κ°€μ§€ μΉ΄ν…Œκ³ λ¦¬λ‘œ λΆ„λ₯˜ν•˜μ—¬ λŒ€μ‘ν•œλ‹€.

μΉ΄ν…Œκ³ λ¦¬ 상세 μ—λŸ¬ / HTTP μƒνƒœ μ½”λ“œ μž¬μ‹œλ„ μ—¬λΆ€ νŒλ‹¨ κ·Όκ±° 및 λŒ€μ‘
A. μ—°κ²° λΆˆκ°€
(Network I/O)
Connection Refused
(μ„œλ²„ λ‹€μš΄, 포트 λ‹«νž˜)
❌ μ ˆλŒ€ μ•ˆ 함 μ„œλ²„κ°€ 물리적으둜 κΊΌμ Έ μžˆκ±°λ‚˜ μ‹€ν–‰λ˜μ§€ μ•Šμ€ μƒνƒœ. μž¬μ‹œλ„ν•΄λ΄€μž 100% μ‹€νŒ¨ν•˜λ―€λ‘œ μ¦‰μ‹œ μžμ› λ‚­λΉ„λ₯Ό 막고 μ’…λ£Œν•œλ‹€.
UnknownHostException
(DNS 찾을 수 μ—†μŒ)
❌ μ ˆλŒ€ μ•ˆ 함 잘λͺ»λœ 도메인/IP μ„€μ •. μž¬μ‹œλ„ν•΄λ„ ν•΄κ²°λ˜μ§€ μ•ŠμŒ.
Connect Timeout
(μ—°κ²° μ‹œκ°„ 초과)
πŸ”Ί 1회만 λ„€νŠΈμ›Œν¬ μΌμ‹œμ  지연일 수 μžˆμœΌλ‚˜, μ„œλ²„ κ³ΌλΆ€ν•˜μΌ μˆ˜λ„ μžˆμœΌλ―€λ‘œ μ†Œκ·Ήμ  μž¬μ‹œλ„.
B. μ„œλ²„ μ—λŸ¬
(Server Side)
500 Internal Server Error β­• μž¬μ‹œλ„ 함 DB 락(Lock)μ΄λ‚˜ μΌμ‹œμ  μ½”λ“œ 였λ₯˜. μž μ‹œ ν›„ ν•΄μ†Œλ  κ°€λŠ₯μ„± 있음.
502 Bad Gateway
503 Service Unavailable
β­• μž¬μ‹œλ„ 함 배포 μ€‘μ΄κ±°λ‚˜ νŠΈλž˜ν”½ 폭주 상황. **Backoff(λŒ€κΈ° μ‹œκ°„)**λ₯Ό 두고 μž¬μ‹œλ„ ν•„μš”.
504 Gateway Timeout β­• μž¬μ‹œλ„ 함 Leaf Node μ²˜λ¦¬κ°€ λŠ¦μ–΄μ§€λŠ” 경우.
C. ν΄λΌμ΄μ–ΈνŠΈ μ—λŸ¬
(Request Side)
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
❌ μ ˆλŒ€ μ•ˆ 함 μš”μ²­ λ°μ΄ν„°λ‚˜ URL이 잘λͺ»λ¨. 백만 번 λ‹€μ‹œ 보내도 μ‹€νŒ¨ν•¨. μ¦‰μ‹œ μ—λŸ¬ 둜그 기둝.
D. κ³ΌλΆ€ν•˜ μ œμ–΄
(Rate Limit)
429 Too Many Requests β­• μž¬μ‹œλ„ 함 (μ€‘μš”) μ¦‰μ‹œ μž¬μ‹œλ„κ°€ μ•„λ‹ˆλΌ, μ„œλ²„κ°€ 헀더에 μ€€ μ‹œκ°„λ§ŒνΌ λŒ€κΈ° ν›„ μž¬μ‹œλ„ν•΄μ•Ό 함.

3. μž¬μ‹œλ„ 상세 λ©”μ»€λ‹ˆμ¦˜ (Retry Strategy)

3.1. μ΅œλŒ€ μž¬μ‹œλ„ 횟수 (Max Attempts)

  • μ„€μ •: μ΅œλŒ€ 3회 (졜초 μ‹œλ„ 1회 + μž¬μ‹œλ„ 2회)
  • 이유: 3회 이상 μ‹€νŒ¨ν•˜λŠ” μš”μ²­μ€ μΌμ‹œμ  였λ₯˜κ°€ 아닐 ν™•λ₯ μ΄ λ†’μœΌλ©°, κ·Έ 이상은 전체 μ‹œμŠ€ν…œ(Hub)의 μŠ€λ ˆλ“œλ₯Ό μ μœ ν•˜μ—¬ λ‹€λ₯Έ 정상적인 λΈŒλ‘œλ“œμΊμŠ€νŒ…μ„ 방해함.

3.2. λŒ€κΈ° μ‹œκ°„ μ „λž΅ (Backoff Strategy)

  • μ „λž΅: Fixed Delay (κ³ μ • λŒ€κΈ°) λ˜λŠ” Jitter(랜덀 λŒ€κΈ°)
    • ꢌμž₯: 1초 간격 κ³ μ • λŒ€κΈ° (Fixed Delay 1s)
    • 이유: 3λŒ€ μ •λ„μ˜ λ…Έλ“œλΌλ©΄ λ³΅μž‘ν•œ μ§€μˆ˜ λ°±μ˜€ν”„(Exponential Backoff)κΉŒμ§€λŠ” λΆˆν•„μš”ν•˜λ‚˜, λ…Έλ“œκ°€ 50λŒ€ 이상 λŠ˜μ–΄λ‚˜λ©΄ Jitter(랜덀)λ₯Ό λ„μž…ν•˜μ—¬ λ™μ‹œμ— μž¬μ‹œλ„ μš”μ²­μ΄ λͺ°λ¦¬λŠ” 것을 λ°©μ§€ν•΄μ•Ό 함.

4. μ‹€νŒ¨ 처리 ν”„λ‘œμ„ΈμŠ€ (Fallback Flow)

λͺ¨λ“  μž¬μ‹œλ„(λ˜λŠ” μ¦‰μ‹œ μ‹€νŒ¨) 후에도 전솑이 μ‹€νŒ¨ν•œ 경우, μ•„λž˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ”°λ₯Έλ‹€.

  1. 둜그 기둝: μ—λŸ¬ 원인(Cause)을 λͺ…ν™•νžˆ 남긴닀. (λ‹¨μˆœ "μ‹€νŒ¨"κ°€ μ•„λ‹Œ "Connection Refused" 인지 "500 Error" 인지 ꡬ뢄)
  2. Dead Letter 처리: μ‹€νŒ¨ν•œ Payload와 Target URL을 λ³„λ„μ˜ μ €μž₯μ†Œ(DB ν…Œμ΄λΈ” failed_broadcast_logs λ˜λŠ” 파일)에 μ €μž₯ν•œλ‹€.
  3. μ•Œλ¦Ό λ°œμ†‘ (μ˜΅μ…˜): μ‹€νŒ¨μœ¨μ΄ 일정 μž„κ³„μΉ˜(예: 5λΆ„κ°„ 10건 이상)λ₯Ό λ„˜μœΌλ©΄ μŠ¬λž™/이메일 μ•Œλ¦Όμ„ λ°œμ†‘ν•œλ‹€.

5. 데이터 흐름도 (Logic Flowchart)

graph TD
    A[Hub: 전솑 μ‹œλ„] --> B{μ—λŸ¬ λ°œμƒ?}
    B -- No (성곡) --> C[βœ… 성곡 둜그 및 μ’…λ£Œ]
    B -- Yes (μ—λŸ¬) --> D{μ—λŸ¬ νƒ€μž… 뢄석}
    
    D -- "μ„œλ²„ λ‹€μš΄ / 4xx μ—λŸ¬ / DNS 였λ₯˜" --> E[β›” μ¦‰μ‹œ μ‹€νŒ¨ 처리 (No Retry)]
    D -- "5xx μ—λŸ¬ / νƒ€μž„μ•„μ›ƒ" --> F{μž¬μ‹œλ„ 횟수 λ‚¨μŒ?}
    
    F -- Yes --> G[⏳ 1초 λŒ€κΈ° (Backoff)]
    G --> A
    F -- No (횟수 초과) --> E
    
    E --> H[πŸ“ μ‹€νŒ¨ ν•Έλ“€λŸ¬ μ‹€ν–‰]
    H --> I[파일/DB에 μ‹€νŒ¨ 이λ ₯ μ €μž₯]
Loading