Rate Limiting Per Client
Har bir mijoz uchun tezlikni cheklash
Klub eshigidagi bodigard mehmonlar RO'YXATINI tutadi va HAR BIR kishi nechta marta kirganini SANAYDI — belgilangan sondan OSHIB ketsa, "bugun yetarli, ertaga keling" deydi. Bu — BOSHQA mehmonlarga XALAQIT bermaslik uchun. Rate limiting — API'da xuddi shu vazifani bajaradi: bitta mijoz (yoki uning API kaliti) BELGILANGAN sondan KO'P so'rov yuborsa, server QOLGAN so'rovlarni RAD ETADI — bu BOSHQA mijozlarni HIMOYA qiladi va serverni ORTIQCHA yuklanishdan SAQLAYDI.
package main
import (
"fmt"
"sync"
)
// RateLimiter — har bir mijoz (clientID) uchun ALOHIDA so'rovlar sonini sanaydi
type RateLimiter struct {
mu sync.Mutex
counts map[string]int
limit int
}
func NewRateLimiter(limit int) *RateLimiter {
return &RateLimiter{counts: make(map[string]int), limit: limit}
}
// Allow — mijoz limitdan OSHMAGAN bo'lsa true, OSHGAN bo'lsa false qaytaradi
func (rl *RateLimiter) Allow(clientID string) bool {
rl.mu.Lock()
defer rl.mu.Unlock()
rl.counts[clientID]++
return rl.counts[clientID] <= rl.limit
}
func main() {
limiter := NewRateLimiter(3)
for i := 0; i < 5; i++ {
fmt.Println(limiter.Allow("client-1"))
}
}Bu — "fixed window" (belgilangan oyna) tezlikni cheklash naqshi eng SODDA ko'rinishida: counts xaritasi HAR BIR mijoz uchun so'rovlar sonini SAQLAYDI, limitdan OSHGANDA false qaytariladi. HAQIQIY production tizimda bu "oyna" VAQT bo'yicha (masalan "har daqiqada") DAVRIY ravishda NOLGA tushiriladi — biz bu darsda vaqtga BOG'LIQ bo'lmagan, SODDA hisoblagichga e'tibor qaratamiz.
sync.Mutex — "The Basic CRUD Handlers" darslaridagi kabi, BIR VAQTDA ko'p so'rov kelganda counts xaritasi XAVFSIZ yangilanishini kafolatlaydi. E'tibor bering: birinchi 3 ta so'rov true (ruxsat berilgan), 4- va 5- so'rovlar false — mijoz limitdan OSHIB ketgan.
>_ Exercise
RateLimiter'ni HTTP middleware sifatida ulang va MIJOZLAR bir-biriga TA'SIR qilmasligini isbotlang.
- •rateLimitMiddleware(limiter *RateLimiter, next http.HandlerFunc) http.HandlerFunc yozing: "X-Client-ID" sarlavhasi bo'yicha Allow'ni chaqirsin, false bo'lsa http.StatusTooManyRequests (429) va "juda ko'p so'rov, birozdan keyin urinib ko'ring" qaytarsin
- •limit=2 bilan limiter yarating, "client-1" uchun 3 marta so'rov yuboring (oxirgisi 429 bo'lishi kerak)
- •"client-2" uchun BITTA so'rov yuboring — u client-1'ning limitidan TA'SIRLANMAGANINI ko'rsating (muvaffaqiyatli bo'lishi kerak)
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Tezlikni cheklash (rate limiting) — HAR BIR mijozni ALOHIDA hisoblab, belgilangan chegaradan oshgan so'rovlarni 429 status bilan rad etadi; bitta mijozning ortiqcha faolligi BOSHQA mijozlarga hech qanday ta'sir QILMASLIGI kerak.
NEXT UP
Request Logging & Correlation IDs
$ go run main.go
Kodingizni ishga tushiring