Rate Limit, Bulkhead
μ₯μ κ° λ°μνκΈ° μ , μμ€ν μ΄ κ°λΉν μ μλ μμ€μΌλ‘ λΆνλ₯Ό μ μ΄νμ¬ μ₯μ λ₯Ό μλ°©νλ λ κ°μ§ ν΅μ¬ κΈ°μ μ΄ μ‘΄μ¬ν©λλ€. Rate Limit, Bulkheadμ νΈμΆλμ μ ννμ¬ μμ€ν μμμ΄ κ³Όλν λΆνλ₯Ό λ°μ§ μλλ‘ λ³΄νΈνλ€λ 곡ν΅μ μ΄ μμ§λ§, μ ν λ°©μμμμ μ°¨μ΄κ° μ‘΄μ¬ν©λλ€.
Rate Limit
Rate Limiterλ μ΄λ¦ κ·Έλλ‘ μ€ν νμλ₯Ό μ ννλ κΈ°μ μ λλ€.
μ ν리μΌμ΄μ μμ Rate Limitμ ν¬κ² λ κ³³μ μ μ©ν μ μμ΅λλ€.
μμ²μ΄ λ€μ΄μ€λ κ³³ (Inbound)
κ°μ₯ λ§μ΄ λ³Ό μ μλ μΌμ΄μ€μ λλ€.
νΉμ μ¬μ©μλ API Keyλ₯Ό κΈ°μ€μΌλ‘ μμ² νμλ₯Ό μ ννμ¬, νΉμ μ¬μ©μκ° μμ€ν 리μμ€λ₯Ό λ μ νκ±°λ κ³Όλν λΉμ©μ μ λ°νλ κ²μ λ°©μ§ν©λλ€.
μμ²μ΄ λκ°λ κ³³ (Outbound)
μμ²μ λ°λ λμ μλΉμ€λ‘ κ³Όλν νΈλν½μ΄ λκ°μ§ μλλ‘ μ νν©λλ€.
ꡬμΆν μλ²κ° μΈλΆ μλΉμ€(νμ¬ API λ±)λ₯Ό νΈμΆν λ μ μ©ν μ μμ΅λλ€.
ν μλΉμ€μ μμ€ν μ΄ κ°λΉν μ μμ λ§νΌ κ³Όλν νΈλν½μ 보λ΄μ§ μλλ‘ λ³΄νΈνλ μν μ μνν©λλ€.
[μμ: λ‘κ·Έ μμ€ν
보νΈνκΈ°]
Rate Limiterλ API νΈμΆλΏλ§ μλλΌ μλ¬ λ‘κ·Έ μ²λ¦¬μλ μ μ©ν©λλ€.
μμ€ν μ μ₯μ κ° ν°μ§λ©΄ μλ¬ λ‘κ·Έκ° νλ°μ μΌλ‘ λ°μνμ¬ Slack μ±λμ΄ λ§λΉλκ±°λ λ‘κ·Έ μλ²(ELK λ±)κ° λ»μ΄λ²λ¦΄ μ μμ΅λλ€.
μ΄λ λ‘κ·Έ μ μ‘ λ‘μ§μ Rate Limitμ κ±Έμ΄λλ©΄, νμμλ μ 보λ΄λ€κ° μ₯μ μμλ λ‘κ·Έλ₯Ό μ°¨λ¨νκ±°λ μμ½ν΄μ 보λμΌλ‘μ¨ 2μ°¨ νΌν΄λ₯Ό λ§μ μ μμ΅λλ€.
resilience4jλ Rate Limit κΈ°λ₯μ μ 곡νλ λ°, μν·μ λΉν΄μ κΈ°λ₯μ΄ μ‘°κΈ λ―Έμ½ν©λλ€.
Bulkhead
λ²ν¬ν€λλ β격벽βμ΄λΌλ μλ―ΈμΈλ°, μ λ° λ΄λΆλ₯Ό μ¬λ¬ 격벽μΌλ‘ λλμ΄, ν κ³³μ ꡬλ©μ΄ λλ λ°° μ μ²΄κ° μΉ¨λͺ°νμ§ μκ² νλ κ²μμ μ λνμ΅λλ€.
SWμμλ λμμ μ§μ ν μ μλ μλ₯Ό μ ννλ λ°©μμΌλ‘ ꡬνλ©λλ€. κ·Έλμ λ²ν¬ν€λκ° μ μ©λ μμμλ λμμ μ§μ ν μ μλ μ€λ λμ μλ₯Ό μ νν μ μμ΅λλ€.
λΉμ·ν κ°λ
μΌλ‘λ synchronized ν€μλλ‘ λκΈ°νλ₯Ό νλ κ²λ λμμ νλμ νλ¦λ§ λΈλ‘μ μ§μ
νλλ‘ μ ννλ κ²μ
λλ€. μ΄λ λ°©μ μ체λ κ°μ§λ§ λͺ©μ μμ²΄κ° λ€λ¦
λλ€.
λ²ν¬ν€λλ λκΈ°νκ° λͺ©μ μ΄ μλλΌ, 보νΈνλ €λ λμμ 리μμ€κ° κ³Όλνκ² μ¬μ©λλ κ²μ λ§λκ²μ λλ€.
μ€λ λ ν, 컀λ₯μ νμ΄ λ²ν¬ν€λμ μμ ν λμΌν κ°λ μΌλ‘λ λ³Ό μ μμ΅λλ€.
λ무 λ§μ μμ²μ΄ λμμ μ²λ¦¬λμ§ μλλ‘ μ ννλ μν
λ무 λ§μ μμ²μ λμμ μ²λ¦¬νλ©΄ 컨ν μ€νΈ μ€μμΉκ°μ μ€λ²ν€λ λλ¬Έμ μ€νλ € μ 체 μ±λ₯μ΄ μ νλ μ μμ΄μ μ νμ νλ κ²μ΄λ€.
[λμ μ리]
리μμ€ κ²©λ¦¬:
λκΈ°ν(synchronized)μ λΉμ·νμ§λ§ λͺ©μ μ΄ λ€λ¦ λλ€.
λκΈ°νλ λ°μ΄ν° μ ν©μ±μ΄ λͺ©μ μ΄λΌλ©΄,
Bulkheadλ νΉμ κΈ°λ₯μ΄ μ 체 리μμ€(μ: μ€λ λ/컀λ₯μ ν λ±)λ₯Ό κ³ κ°μν€λ κ²μ λ§λ κ²μ΄ λͺ©μ μ λλ€.
μμ:
μ΄λ―Έ μ¬μ©νκ³ μλ DBCP(Database Connection Pool)μ΄λ ν°μΊ£μ μ€λ λ νμ΄ ν΄λΉ ν¨ν΄μ μΌμ’ μ λλ€.
ν¨κ³Ό:
λ무 λ§μ μμ²μ λμμ μ²λ¦¬νλ©΄ 컨ν μ€νΈ μ€μμΉ λΉμ© λλ¬Έμ μ€νλ € μ±λ₯μ΄ μ νλ μ μμ΅λλ€.
Bulkheadλ μ΄λ₯Ό μ μ ν μ ννμ¬ μ 체 μμ€ν μ μ²λ¦¬λμ μ μ§ν©λλ€.
Resilience4j
Resilien4j κΈ°μ€μμ Rate Limit, Bulkhead λͺ¨λ μ νλλ μμμ κΈ°λ³Έμ μΌλ‘ λ©μλ λ¨μμ
λλ€.
Circuit: λμ λΆνλ₯Ό λ°λ κ²½μ°(μμΈ, λλ¦° μλ΅) μΌμμ μΌλ‘ νΈλν½ μ°¨λ¨νμ¬ μμ€ν μ ν볡
Rate Limiter: λμ λΆνλ₯Ό μλ°©νκΈ° μν΄μ μκ°λΉ μ€ν νμλ₯Ό μ ν
Bulkhead: λμ λΆνλ₯Ό μλ°©νκΈ° μν΄, λμμ μ²λ¦¬ν μ μλ μ€λ λ μ μ ν
λΆμ° νκ²½μμ λ°μν μ μλ λ¬Έμ μ κ³Ό λμ
λ¨μΌ μλ²μμλ λ©λͺ¨λ¦¬ λ΄μμ ν΄κ²°νλ©΄ λμ§λ§, μλ²κ° μ¬λ¬ λμΈ λΆμ° νκ²½μμλ κ³ λ―Όμ΄ νμν μ μμ΅λλ€.
Rate Limiterλ Bulkheadμ μνλ₯Ό μλ²λΌλ¦¬ 곡μ νλ €λ©΄ λ³΄ν΅ Redis κ°μ μΈλΆ μ μ₯μλ₯Ό μ¬μ©ν©λλ€. νμ§λ§ κ·Έλ₯ μ¬μ©νκ² λλ€λ©΄ μ΄νμ ν° λ¬Έμ κ° λ°μν μ μμ΅λλ€.
[λ¬Έμ μν©: μν κ΄λ¦¬λ₯Ό νλ Redisκ° μ£½μΌλ©΄?]
μ΄λ μ νν μ μλ 3κ°μ§ λ°©μμ΄ μμ΅λλ€.
μ ν΄μ§ κ²μ μμΌλ©° λΉμ¦λμ€ νΉμ μλΉμ€ κ·μΉμ λ§μΆ° μ μ νκ² μ νν΄μΌ ν©λλ€.
Fail Open (λͺ¨λ νμ©)
Redisκ° μ£½μΌλ©΄ μ νμ νκ³ λͺ¨λ μμ²μ λ°μ΅λλ€.
μμ€ν μ κ°μ©μ±μ΄ μ€μν κ²½μ° μ νν μ μμ§λ§, μμ€ν κ³ΌλΆν μνλ μ‘΄μ¬ν©λλ€.
Fail Closed (λͺ¨λ μ°¨λ¨)
Redisκ° μ£½μΌλ©΄ λͺ¨λ μμ²μ κ±°λΆν©λλ€.
μμ€ν μ 보νΈνλ κ²μ μ§μ€νμ§λ§, μλΉμ€ μ€λ¨μ΄ λ°μν μ μμ΅λλ€.
Local Fallback (μΈμ€ν΄μ€λ³λ‘ μ€μ )
Redisκ° μ£½μΌλ©΄, κ° μλ²μ λ‘컬 λ©λͺ¨λ¦¬λ₯Ό κΈ°μ€μΌλ‘ μ νν©λλ€.
κ°μ₯ νλͺ ν λμμ΄λΌκ³ μκ°λμ§λ§, μ¬μ©μ μ μ₯μμ μΌκ΄μ± μλ κ²½νμ ν μ μμ΅λλ€.
Summary
Rate Limiterμ Bulkheadλ μμ€ν μ΄ κ°λΉν μ μλ λ°λλΌμΈμ μ€μ νλ κ²κ³Ό κ°μ΅λλ€.
Rate Limiterλ‘ μμ² λΉλλ₯Ό μ μ΄νκ³
Bulkheadλ‘ μμμ 격리νκ³
λ¬Έμ κ° λ°μνλ©΄ μν·μΌλ‘ μ°κ²°μ μ°¨λ¨ν μ μμ΅λλ€.
μΈ κ°μ§ λ°©μμ΄ μ‘°νλ‘κ² μ μ©λμμ λ, κ°μμ€λ¬μ΄ νΈλν½μμλ κ²¬κ³ ν μμ€ν μ ꡬμΆν μ μμ κ²μ λλ€.
Last updated