- λͺ©ν: Kafka Consumer(Server 2)κ° λ€μμ Leaf Node(Server 3, 4, 5...)λ‘ λ©μμ§λ₯Ό μ ν(Broadcasting)ν λ, λΆνμν μ¬μλλ‘ μΈν μμ€ν λΆνλ₯Ό λ°©μ§νκ³ , 볡ꡬ κ°λ₯ν μλ¬λ§ μ λ³μ μΌλ‘ μ¬μλνμ¬ μ μ‘ μ±κ³΅λ₯ μ λμΈλ€.
- ν΅μ¬ μμΉ: Fail Fast (λΉ λ₯Έ μ€ν¨) & Smart Retry (λλν μ¬μλ)
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ν (μ΅μ΄ μλ 1ν + μ¬μλ 2ν)
- μ΄μ : 3ν μ΄μ μ€ν¨νλ μμ²μ μΌμμ μ€λ₯κ° μλ νλ₯ μ΄ λμΌλ©°, κ·Έ μ΄μμ μ 체 μμ€ν (Hub)μ μ€λ λλ₯Ό μ μ νμ¬ λ€λ₯Έ μ μμ μΈ λΈλ‘λμΊμ€ν μ λ°©ν΄ν¨.
- μ λ΅: Fixed Delay (κ³ μ λκΈ°) λλ Jitter(λλ€ λκΈ°)
- κΆμ₯: 1μ΄ κ°κ²© κ³ μ λκΈ° (
Fixed Delay 1s) - μ΄μ : 3λ μ λμ λ ΈλλΌλ©΄ 볡μ‘ν μ§μ λ°±μ€ν(Exponential Backoff)κΉμ§λ λΆνμνλ, λ Έλκ° 50λ μ΄μ λμ΄λλ©΄ Jitter(λλ€)λ₯Ό λμ νμ¬ λμμ μ¬μλ μμ²μ΄ λͺ°λ¦¬λ κ²μ λ°©μ§ν΄μΌ ν¨.
- κΆμ₯: 1μ΄ κ°κ²© κ³ μ λκΈ° (
λͺ¨λ μ¬μλ(λλ μ¦μ μ€ν¨) νμλ μ μ‘μ΄ μ€ν¨ν κ²½μ°, μλ νλ‘μΈμ€λ₯Ό λ°λ₯Έλ€.
- λ‘κ·Έ κΈ°λ‘: μλ¬ μμΈ(Cause)μ λͺ νν λ¨κΈ΄λ€. (λ¨μ "μ€ν¨"κ° μλ "Connection Refused" μΈμ§ "500 Error" μΈμ§ ꡬλΆ)
- Dead Letter μ²λ¦¬: μ€ν¨ν
PayloadμTarget URLμ λ³λμ μ μ₯μ(DB ν μ΄λΈfailed_broadcast_logsλλ νμΌ)μ μ μ₯νλ€. - μλ¦Ό λ°μ‘ (μ΅μ ): μ€ν¨μ¨μ΄ μΌμ μκ³μΉ(μ: 5λΆκ° 10건 μ΄μ)λ₯Ό λμΌλ©΄ μ¬λ/μ΄λ©μΌ μλ¦Όμ λ°μ‘νλ€.
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μ μ€ν¨ μ΄λ ₯ μ μ₯]