GoDasturchi
Rate Limiting Per Client

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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