Token Bucket

이 μ•Œκ³ λ¦¬μ¦˜μ˜ 핡심 μ•„μ΄λ””μ–΄λŠ”, "μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” 토큰(Token)을 미리 μ •ν•΄μ§„ μ†λ„λ‘œ 버킷(Bucket)에 μ±„μ›Œλ‘κ³ , μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ 토큰을 μ†Œλͺ¨ν•˜μ—¬ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 방식" 이닀.

κ°„λ‹¨ν•˜κ²Œ λΉ„μœ ν•˜λ©΄, 좩전식 κ΅ν†΅μΉ΄λ“œμ™€ λΉ„μŠ·ν•˜λ‹€.

  • 버킷(Bucket): κ΅ν†΅μΉ΄λ“œ. μΉ΄λ“œμ— μΆ©μ „ν•  수 μžˆλŠ” μ΅œλŒ€ κΈˆμ•‘(토큰)이 μ •ν•΄μ Έ μžˆλ‹€.

  • 토큰(Token): κ΅ν†΅μΉ΄λ“œμ— μΆ©μ „λœ μž”μ•‘μ΄λ‹€.

  • 토큰 곡급기(리필속도, Refiller): 일정 μ‹œκ°„λ§ˆλ‹€(예: 1μ΄ˆμ— 1,000원씩) μΉ΄λ“œμ— μž”μ•‘μ„ μžλ™μœΌλ‘œ μΆ©μ „ν•˜λŠ” μž₯치

κ΅ν†΅μΉ΄λ“œμ— μž”μ•‘(토큰)이 μžˆμ–΄μ•Όλ§Œ λ²„μŠ€λ₯Ό νƒˆ 수 있고, μž”μ•‘μ΄ μ—†μœΌλ©΄ νƒˆ 수 μ—†λ‹€. μΉ΄λ“œλŠ” κ³„μ†ν•΄μ„œ μžλ™μœΌλ‘œ μΆ©μ „λ˜μ§€λ§Œ, μ΅œλŒ€ μΆ©μ „ ν•œλ„(버킷 크기)λ₯Ό λ„˜μ–΄μ„œλŠ” κΈˆμ•‘μ΄ μŒ“μ΄μ§€λŠ” μ•ŠλŠ”λ‹€.

λ™μž‘ 방식

  1. 버킷 생성: 각 μ‚¬μš©μž(λ˜λŠ” IP)λ§ˆλ‹€ μ •ν•΄μ§„ 크기(Capacity)의 버킷을 λ§Œλ“ λ‹€. 이 버킷은 토큰을 λ‹΄λŠ” 역할을 ν•œλ‹€.

  2. 토큰 곡급: μ •ν•΄μ§„ 속도(Refill Rate)둜 버킷에 토큰을 주기적으둜 μΆ”κ°€ν•œλ‹€. 예λ₯Ό λ“€μ–΄, "1μ΄ˆμ— 1κ°œμ”© 토큰을 μΆ”κ°€"ν•˜λŠ” 방식이닀. 버킷이 가득 μ°¨ μžˆλ‹€λ©΄ 더 이상 토큰은 μΆ”κ°€λ˜μ§€ μ•ŠλŠ”λ‹€.

  3. μš”μ²­ 처리 및 토큰 μ†Œλͺ¨: μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄, 버킷에 토큰이 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.

  4. ν•œλ„ 확인:

    • ν—ˆμš© (Allow): 버킷에 1개 μ΄μƒμ˜ 토큰이 μžˆλ‹€λ©΄, 토큰 1개λ₯Ό μ‚¬μš©ν•˜κ³  μš”μ²­μ„ μ²˜λ¦¬ν•œλ‹€.

    • κ±°λΆ€ (Deny): 버킷에 토큰이 μ—†λ‹€λ©΄, μš”μ²­μ„ κ±°λΆ€ν•œλ‹€.

πŸ‘ μž₯점

  • μœ μ—°ν•œ νŠΈλž˜ν”½ μ œμ–΄ (Burst νŠΈλž˜ν”½ ν—ˆμš©): μš”μ²­μ΄ μ—†λŠ” λ™μ•ˆ 토큰이 버킷에 계속 μŒ“μΈλ‹€. 덕뢄에 μ‚¬μš©μžλŠ” μˆœκ°„μ μœΌλ‘œ λͺ°λ¦¬λŠ” μš”μ²­(Burst) 을 λͺ¨μ•„λ‘” ν† ν°λ§ŒνΌ μ²˜λ¦¬ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 1μ΄ˆμ— 1κ°œμ”© 토큰이 μ±„μ›Œμ§€κ³  버킷 크기가 10이라면, 10초 λ™μ•ˆ μš”μ²­μ΄ μ—†λ‹€κ°€ ν•œμˆœκ°„μ— 10개의 μš”μ²­μ„ 보내도 λͺ¨λ‘ μ²˜λ¦¬λœλ‹€. μ΄λŠ” 전체 평균 μš”μ²­λ₯ μ€ μœ μ§€ν•˜λ©΄μ„œλ„ μΌμ‹œμ μΈ νŠΈλž˜ν”½ 폭증에 μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•  수 있게 ν•΄μ€€λ‹€.

  • 직관적인 둜직: μ•Œκ³ λ¦¬μ¦˜μ˜ λ™μž‘ 방식이 "토큰을 μ±„μš°κ³ , μ‚¬μš©ν•œλ‹€"λŠ” κ°œλ…μœΌλ‘œ 맀우 μ§κ΄€μ μ΄μ–΄μ„œ μ΄ν•΄ν•˜κΈ° 쉽닀.

  • 높은 예츑 κ°€λŠ₯μ„±: 토큰이 μ±„μ›Œμ§€λŠ” 속도가 κ³ μ •λ˜μ–΄ μžˆμ–΄, μž₯기적으둜 μ‹œμŠ€ν…œμ΄ μ²˜λ¦¬ν•  수 μžˆλŠ” 평균 μš”μ²­λŸ‰μ„ μ˜ˆμΈ‘ν•˜κΈ° 쉽닀.

πŸ‘Ž 단점

  • κ΅¬ν˜„ λ³΅μž‘μ„±: μ—¬λŸ¬ μƒνƒœλ₯Ό ν•¨κ»˜ 관리해야 ν•œλ‹€. 각 μ‚¬μš©μžλ§ˆλ‹€ 버킷 크기(Capacity), ν˜„μž¬ 토큰 수(Token Count), 그리고 λ§ˆμ§€λ§‰ 토큰 리필 μ‹œκ°„(Last Refill Timestamp) μ΄λΌλŠ” 3κ°€μ§€ μƒνƒœλ₯Ό λͺ¨λ‘ κΈ°λ‘ν•˜κ³  관리해야 ν•˜λ―€λ‘œ κ΅¬ν˜„μ΄ μƒλŒ€μ μœΌλ‘œ λ³΅μž‘ν•  수 μžˆλ‹€.

  • λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰: 관리해야 ν•  μƒνƒœκ°€ 많기 λ•Œλ¬Έμ—, μ‚¬μš©μž μˆ˜κ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ 더 λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€.

πŸ’₯ κ²°κ³Ό: 토큰 버킷 μ•Œκ³ λ¦¬μ¦˜μ€ μˆœκ°„μ μΈ νŠΈλž˜ν”½ 폭증은 ν—ˆμš©ν•˜λ©΄μ„œλ„ 전체적인 평균 μš”μ²­λ₯ μ€ μ œμ–΄ν•˜κ³  싢을 λ•Œ 맀우 효과적인 방식이닀. API κ²Œμ΄νŠΈμ›¨μ΄λ‚˜ λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½ μ œμ–΄ λ“±μ—μ„œ 널리 μ‚¬μš©λ˜λŠ” μ •κ΅ν•œ Rate Limiting 기법 쀑 ν•˜λ‚˜μ΄λ‹€.

Last updated