οΌ»λ…μ„œκΈ°λ‘οΌ½ 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 4μž₯

πŸ“– 제λͺ© : 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 : 4μž₯
πŸ™‹β€β™‚οΈ μ €μž : μ•Œλ ‰μŠ€ 쉬
4μž₯μ—μ„œλŠ” 처리율 μ œν•œ μž₯치(Rate Limiter) 섀계에 λŒ€ν•΄ 닀루고 μžˆλ‹€. 처리율 μ œν•œ μž₯μΉ˜λž€ 말 κ·ΈλŒ€λ‘œ νŠΉμ • μ‹œκ°„ λ™μ•ˆ μ„œλ²„λ‘œ μ˜€λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ˜ 수λ₯Ό μ œν•œν•˜λŠ” μž₯μΉ˜λ‹€. ν•œ λ²ˆμ— λŒ€μš©λŸ‰ νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•΄λ„ λͺ¨μžλž„ νŒμ— μš”μ²­μ„ λ§‰λŠ” μ΄μœ λŠ” 뭘까? 이 μž₯μ—μ„œλŠ” μ™œ 처리율 μ œν•œμ΄ ν•„μš”ν•œμ§€μ™€ ν•¨κ»˜ λŒ€ν‘œμ μΈ 처리율 μ œν•œ μ•Œκ³ λ¦¬μ¦˜λ“€μ„ μ‚΄νŽ΄λ³΄κ³  μžˆλ‹€.

πŸ“Œ4μž₯. μ™œ 처리율 μ œν•œμ΄ ν•„μš”ν• κΉŒ?

예λ₯Ό λ“€μ–΄, μ–΄λ–€ API에 ν•œ μ‚¬λžŒμ΄ μ΄ˆλ‹Ή 100λ²ˆμ”© μš”μ²­μ„ 보내면 μ–΄λ–»κ²Œ 될까? λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

  • μ„œλ²„ μžμ›μ΄ 고갈됨 (CPU, λ©”λͺ¨λ¦¬, λ„€νŠΈμ›Œν¬ λ“±)
  • λ‹€λ₯Έ 정상 μœ μ €μ—κ²Œ ν”Όν•΄κ°€ 감
  • DDoS 같은 곡격에 μ„œλ²„κ°€ λ¬΄λ„ˆμ§€κΈ°λ„ 함
  • λΉ„μš©λ„ 올라감 (νŠΈλž˜ν”½ 기반 μš”κΈˆμ΄λΌλ©΄)

πŸ‘‰ κ·Έλž˜μ„œ 처리율 μ œν•œ μž₯μΉ˜λŠ” 곡격자 λ˜λŠ” κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” μœ μ €λ₯Ό μ œμ–΄ν•˜κ³ , 전체 μ‹œμŠ€ν…œμ˜ 곡정성과 μ•ˆμ •μ„±μ„ μ§€ν‚€λŠ” μ€‘μš”ν•œ 역할을 ν•œλ‹€.

πŸ“Œμ²˜λ¦¬μœ¨ μ œν•œμ˜ 핡심

μ²˜λ¦¬μœ¨μ€ λˆ„κ°€, μ–Όλ§ˆλ‚˜ 자주, μ–΄λ–€ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜λŠ”μ§€λ₯Ό κΈ°μ€€μœΌλ‘œ μ œν•œμ„ λ‘”λ‹€. μ±…μ—μ„œ μ •λ¦¬ν•œ 섀계 μ‹œμ˜ 고렀사항은 λ‹€μŒκ³Ό κ°™λ‹€.

λŒ€ν‘œμ μΈ μ œν•œ κΈ°μ€€

  • 호좜 μ œν•œ μœ„μΉ˜κ°€ ν΄λΌμ΄μ–ΈνŠΈ 츑인지, μ„œλ²„ 츑인지
  • 호좜 μ œν•œ 기쀀은 무엇인가? μ‚¬μš©μž ID, IP, API Key λ“±λ“±.
  • μ΄ˆλ‹Ή/λΆ„λ‹Ή/μ‹œκ°„λ‹Ή μš”μ²­ 수 μ œν•œμ€ μ–Όλ§ˆλ‘œ ν•  것인가
  • λΆ„μ‚° ν™˜κ²½μ—μ„œ λ™μž‘ν•΄μ•Ό ν•˜λŠ”κ°€?
  • λ¦¬μ†ŒμŠ€λ‹Ή μ œν•œ (예: /api/commentsλŠ” λΆ„λ‹Ή 10λ²ˆκΉŒμ§€λ§Œ)이 λ”°λ‘œ μ‘΄μž¬ν•˜λŠ”κ°€
  • 처리율 μ œν•œμ— 걸렸을 λ•Œ, μ‚¬μš©μžκ°€ κ·Έ κ²°κ³Όλ₯Ό μ•Œμ•„μ•Ό ν•˜λŠ”κ°€?

πŸ‘‰ ν•œλ„ μ΄ˆκ³Όκ°€ λ°œμƒν•œ 경우 429번 Too many Request μƒνƒœμ½”λ“œλ‘œ μ—λŸ¬λ©”μ‹œμ§€λ₯Ό 리턴할 μˆ˜λ„ μžˆλ‹€.

πŸ“Œμ‹€λ¬΄μ— 적용 μ‹œ κ³ λ €ν•΄μ•Ό ν•  점

  1. μš”μ²­ 기쀀은 λ¬΄μ—‡μΌκΉŒ? => μ‚¬μš©μž ID, IP, API Key 등…
  2. μ–΄λ””μ—μ„œ μ²˜λ¦¬ν• κΉŒ?
    • ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ²˜λ¦¬ν•  경우 : μš”μ²­μ΄ μœ„λ³€μ‘° 될 κ°€λŠ₯성이 있고, λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈμ˜ μž₯μΉ˜μ— 일괄적인 섀정을 ν•˜κΈ° μ–΄λ €μ›Œμ„œ ꢌμž₯λ˜μ§€ μ•ŠλŠ”λ‹€.
    • μ„œλ²„ λ‚΄μ—μ„œ μ²˜λ¦¬ν•  경우 : κ°„λ‹¨ν•˜μ§€λ§Œ λΆ„μ‚° ν™˜κ²½μ— μ•½ν•˜λ‹€.
    • Redis 같은 쀑앙 μ €μž₯μ†Œμ—μ„œ 처리 : λΆ„μ‚° ν™˜κ²½μ— μ ν•©ν•˜λ‹€.
  3. 지속성 ν•„μš” μ—¬λΆ€
    • μ„œλ²„ μž¬μ‹œμž‘ 후에도 μΉ΄μš΄ν„°λ₯Ό μœ μ§€ν•  것인지

πŸ‘‰ 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λ₯Ό μ‚¬μš©ν•œλ‹€κ³  ν•œλ‹€.