पाठ 10 / 26

Gateway पर Rate Limiting

Token-bucket शैली की सीमाओं से backends की रक्षा करें और clients के साथ निष्पक्ष रहें।

दर और उफान

Gateways प्रति key, user या IP rate-limit करते हैं। Token bucket निरंतर दर और छोटा उफान (burst) अनुमत करता है: bucket में अधिकतम burst tokens रहते हैं, प्रति सेकंड rate से भरता है, और हर अनुरोध एक ख़र्च करता है। nginx में limit_req_zone ... rate=5r/s दर और limit_req ... burst=5 nodelay उफान तय करता है; अतिरिक्त अनुरोध limit_req_status से तय status (429 रखें) के साथ अस्वीकार होते हैं। Retry-After और rate-limit headers लौटाएँ ताकि सुव्यवहारी clients पीछे हटें। Gateway instances के cluster में counters साझा store (जैसे Redis) में रखें या मानें कि हर instance अपना हिस्सा लागू करता है।

Rate limit config

प्रति client IP प्रति सेकंड 5 अनुरोध, तुरंत 5 अतिरिक्त अनुरोधों के उफान की अनुमति के साथ। Gateway config का अंश।

limit_req_zone $binary_remote_addr zone=perip:1m rate=5r/s;
limit_req_status 429;

location /public/ { limit_req zone=perip burst=5 nodelay; proxy_pass http://orders_stable/; }

20 तेज़ अनुरोध, चलाकर

मैंने यह Docker में असली nginx 1.27 gateway पर चलाया, upstreams के रूप में छोटी Node.js services के साथ (पूरा setup केस स्टडी में)। एक साथ 20 अनुरोध भेजने पर पहले 6 सफल होते हैं (दर से अनुमत 1 और 5 का उफान) और बाक़ी 14 429 से अस्वीकार होते हैं।

# 20 concurrent calls to /public/x, tallying status codes

Output:

{"200":6,"429":14}

Token bucket मॉडल, चलाकर

मैंने यह सादा-Python मॉडल चलाया। 5 क्षमता की bucket जो प्रति सेकंड 5 भरती है, 20 तात्कालिक अनुरोधों में से 5 अनुमत करती है, और भरने के बाद एक सेकंड बाद फिर 20 में से 5।

import hashlib, bisect, math, random

class Bucket:
    def __init__(self, cap, rate): self.cap, self.rate, self.tokens, self.t = cap, rate, cap, 0.0
    def allow(self, now):
        self.tokens = min(self.cap, self.tokens + (now - self.t) * self.rate); self.t = now
        if self.tokens >= 1: self.tokens -= 1; return True
        return False
bk = Bucket(5, 5.0)
print(sum(bk.allow(0.0) for _ in range(20)), "allowed of 20 at t=0;", sum(bk.allow(1.0) for _ in range(20)), "of 20 one second later")

Output:

5 allowed of 20 at t=0; 5 of 20 one second later

त्वरित जाँच: Burst setting क्या नियंत्रित करती है?

  • स्थिर दर से ऊपर कितने अनुरोध तुरंत स्वीकार हो सकते हैं
  • Response bodies का आकार
  • TLS version
  • Log format
Answer

स्थिर दर से ऊपर कितने अनुरोध तुरंत स्वीकार हो सकते हैं — Burst छोटे उफान सोखता है जबकि दर लंबी अवधि का औसत सीमित करती है।