π μ λͺ© : κ°μ λ©΄μ μ¬λ‘λ‘ λ°°μ°λ λκ·λͺ¨ μμ€ν
μ€κ³ κΈ°μ΄ : 4μ₯
πββοΈ μ μ : μλ μ€ μ¬
4μ₯μμλ μ²λ¦¬μ¨ μ ν μ₯μΉ(Rate Limiter) μ€κ³
μ λν΄ λ€λ£¨κ³ μλ€.
μ²λ¦¬μ¨ μ ν μ₯μΉλ λ§ κ·Έλλ‘ νΉμ μκ° λμ μλ²λ‘ μ€λ ν΄λΌμ΄μΈνΈμ μμ²μ μλ₯Ό μ ννλ μ₯μΉλ€. ν λ²μ λμ©λ νΈλν½μ μ²λ¦¬ν΄λ λͺ¨μλ νμ μμ²μ λ§λ μ΄μ λ λκΉ? μ΄ μ₯μμλ μ μ²λ¦¬μ¨ μ νμ΄ νμνμ§μ ν¨κ» λνμ μΈ μ²λ¦¬μ¨ μ ν μκ³ λ¦¬μ¦λ€μ μ΄ν΄λ³΄κ³ μλ€.
π4μ₯. μ μ²λ¦¬μ¨ μ νμ΄ νμν κΉ?
μλ₯Ό λ€μ΄, μ΄λ€ APIμ ν μ¬λμ΄ μ΄λΉ 100λ²μ© μμ²μ 보λ΄λ©΄ μ΄λ»κ² λ κΉ? λ€μκ³Ό κ°μ λ¬Έμ κ° λ°μν μ μλ€.
- μλ² μμμ΄ κ³ κ°λ¨ (CPU, λ©λͺ¨λ¦¬, λ€νΈμν¬ λ±)
- λ€λ₯Έ μ μ μ μ μκ² νΌν΄κ° κ°
- DDoS κ°μ 곡격μ μλ²κ° 무λμ§κΈ°λ ν¨
- λΉμ©λ μ¬λΌκ° (νΈλν½ κΈ°λ° μκΈμ΄λΌλ©΄)
π κ·Έλμ μ²λ¦¬μ¨ μ ν μ₯μΉλ 곡격μ λλ κ³Όλνκ² μ¬μ©νλ μ μ λ₯Ό μ μ΄νκ³ , μ 체 μμ€ν μ 곡μ μ±κ³Ό μμ μ±μ μ§ν€λ μ€μν μν μ νλ€.
πμ²λ¦¬μ¨ μ νμ ν΅μ¬
μ²λ¦¬μ¨μ λκ°, μΌλ§λ μμ£Ό, μ΄λ€ 리μμ€μ μ κ·Όνλμ§
λ₯Ό κΈ°μ€μΌλ‘ μ νμ λλ€. μ±
μμ μ 리ν μ€κ³ μμ κ³ λ €μ¬νμ λ€μκ³Ό κ°λ€.
λνμ μΈ μ ν κΈ°μ€
- νΈμΆ μ ν μμΉκ° ν΄λΌμ΄μΈνΈ μΈ‘μΈμ§, μλ² μΈ‘μΈμ§
- νΈμΆ μ ν κΈ°μ€μ 무μμΈκ°? μ¬μ©μ ID, IP, API Key λ±λ±.
- μ΄λΉ/λΆλΉ/μκ°λΉ μμ² μ μ νμ μΌλ§λ‘ ν κ²μΈκ°
- λΆμ° νκ²½μμ λμν΄μΌ νλκ°?
- 리μμ€λΉ μ ν (μ: /api/commentsλ λΆλΉ 10λ²κΉμ§λ§)μ΄ λ°λ‘ μ‘΄μ¬νλκ°
- μ²λ¦¬μ¨ μ νμ κ±Έλ Έμ λ, μ¬μ©μκ° κ·Έ κ²°κ³Όλ₯Ό μμμΌ νλκ°?
π νλ μ΄κ³Όκ° λ°μν κ²½μ° 429λ² Too many Request μνμ½λλ‘ μλ¬λ©μμ§λ₯Ό 리ν΄ν μλ μλ€.
πμ€λ¬΄μ μ μ© μ κ³ λ €ν΄μΌ ν μ
- μμ² κΈ°μ€μ 무μμΌκΉ? => μ¬μ©μ ID, IP, API Key λ±β¦
- μ΄λμμ μ²λ¦¬ν κΉ?
- ν΄λΌμ΄μΈνΈμμ μ²λ¦¬ν κ²½μ° : μμ²μ΄ μλ³μ‘° λ κ°λ₯μ±μ΄ μκ³ , λͺ¨λ ν΄λΌμ΄μΈνΈμ μ₯μΉμ μΌκ΄μ μΈ μ€μ μ νκΈ° μ΄λ €μμ κΆμ₯λμ§ μλλ€.
- μλ² λ΄μμ μ²λ¦¬ν κ²½μ° : κ°λ¨νμ§λ§ λΆμ° νκ²½μ μ½νλ€.
- Redis κ°μ μ€μ μ μ₯μμμ μ²λ¦¬ : λΆμ° νκ²½μ μ ν©νλ€.
- μ§μμ± νμ μ¬λΆ
- μλ² μ¬μμ νμλ μΉ΄μ΄ν°λ₯Ό μ μ§ν κ²μΈμ§
π MSAμ²λΌ API Gatewayκ° μλ κ²½μ°, κ²μ΄νΈμ¨μ΄μμ λ μ΄νΈ 리미ν μ μ²λ¦¬νλ λ°©λ²λ κ³ λ €ν΄λ³Ό μ μλ€. λλ, μ§μ κ°λ°νμ§ μκ³ μ€νμμ€ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ λ°©λ²λ μλ€.
πλνμ μΈ Rate Limiting μκ³ λ¦¬μ¦ 4κ°μ§
1. κ³ μ μλμ°(Fixed Window) μκ³ λ¦¬μ¦
μ ν΄μ§ μκ° λμ μμ² νμλ₯Ό μ ννλ λ°©μμ΄λ€. μλ₯Ό λ€μ΄, 1λΆμ 100λ²λ§ μμ²μ΄ κ°λ₯νκ² νκ³ λ§€ λΆλ§λ€ μΉ΄μ΄ν°λ₯Ό 리μ νλ€.
- π μ₯μ : ꡬνμ΄ μ½λ€
- π λ¨μ : μκ³ μκ°μ λͺ°λ¦¬λ©΄ λ¬Έμ κ° μκΈΈ μ μλ€(ex. 59μ΄μ 100λ², λ€μ 1μ΄μ 100λ² μμ²μ΄ μ€λ©΄ μ€μ λ‘λ κ±°μ μ°μ 200λ² μμ²λ¨)
2. μ¬λΌμ΄λ© μλμ°(Sliding Window) μκ³ λ¦¬μ¦
μμ² νμμ€ν¬νλ₯Ό μ μ₯ν΄μ μ΅κ·Ό 1λΆ(60μ΄) λμμ μμ² μλ₯Ό μ ννλ€. μμμ λ³Έ κ³ μ μλμ°μ λ¨μ μ 보μ
ν μκ³ λ¦¬μ¦μΌλ‘, μ€μ μμ² μκ°μ κΈ°μ€μΌλ‘ νλ¨νλ€.
- π μ₯μ : κ³ μ μλμ°μ μ½μ μ 보μνλ€
- π λ¨μ : νμμ€ν¬νλ₯Ό μ μ₯ν΄μΌ νλ―λ‘ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ λμ΄λλ€.
3. ν ν° λ²ν·(Token Bucket) μκ³ λ¦¬μ¦
ν ν°μ μΌμ κ°κ²©μΌλ‘ μ±μ°κ³ , μμ²ν λλ§λ€ νλμ© κΊΌλ΄ μ°λ λ°©μμ΄λ€.
μ΄λΉ 1κ°μ© ν ν°μ΄ μμ±λκ³ -> λ²ν·μ μ΅λ 10κ°κΉμ§ ν ν°μ μ μ₯ν¨ -> μμ²ν λ ν ν°μ΄ μμΌλ©΄ OK, μμΌλ©΄ κ±°μ νλ 맀컀λμ¦μ΄λ€.
- π μ₯μ : ꡬνμ΄ μ½κ³ , λ©λͺ¨λ¦¬κ° ν¨μ¨μ μ΄λ€. λ²μ€νΈ μν©μμ λμ²κ° κ°λ₯νλ€.
- π λ¨μ : λ΄λΆ μκ° λκΈ°νκ° νμνλ€. λ²ν· μ, ν ν° κ³΅κΈλ₯ μ λν μ μ ν μ‘°μ μ΄ μ΄λ ΅λ€.
π μλ°μμλ Bucket4JλΌλ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄μ μ½κ² μ²λ¦¬μ¨ μ νμ΄ κ°λ₯νλ€κ³ νλ€.
4. λμΆ λ²ν·(Leaky Bucket) μκ³ λ¦¬μ¦
ν΅μ λ¬Ό(μμ²)μ΄ λ€μ΄μ€κ³ , μΌμ ν μλλ‘ λ¬Όμ΄ λΉ μ Έλκ°λ€κ³ μκ°νλ©΄ μ΄ν΄νκΈ° νΈνλ€. μμ²μ΄ λ²ν·μ λ€μ΄μ€λ©΄ μΌμ κ°κ²©μΌλ‘ νλμ© μ²λ¦¬λλλ°, ν λ²μ λ무 λ§μ μμ²μ΄ λ€μ΄μ€λ©΄ λμ³μ λ²λ €μ§λ€.
- π μ₯μ : μ²λ¦¬ μλλ₯Ό κ· μΌνκ² μ‘°μ ν μ μλ€. νμ μ¬μ΄μ¦κ° κ³ μ λμ΄ μμ΄ λ©λͺ¨λ¦¬ μ¬μ©λ μΈ‘λ©΄μμ ν¨μ¨μ μ΄λ€.
- π λ¨μ : μ²λ¦¬ μλκ° λ리면 μμ²μ΄ μ μ€λ μ μλ€. ν ν° λ²ν·κ³Ό λ§μ°¬κ°μ§λ‘ λ μΈμλ₯Ό νλνκΈ° μ΄λ ΅λ€.
π Shopify, Nginxμμ ν΄λΉ μκ³ λ¦¬μ¦μΌλ‘ Rate Limiterλ₯Ό μ¬μ©νλ€κ³ νλ€.