GoDasturchi
Rate Limiting

Rate Limiting

So'rovlar tezligini cheklash

Konsertga bilet sotuvchi bitta kassa oynasi orqali soatiga cheklangan miqdorda bilet sota oladi — agar hamma birdan bostirib kirsa, tizim tanga aylanadi. Rate Limiting (tezlikni cheklash) — bizning /shorten endpoint'imizni shu xil "bostirib kirish"dan (yoki xato/tajovuzkor kod tomonidan ortiqcha so'rov yuborilishidan) himoya qiladi.

example.go
package main

import (
	"fmt"
	"sync"
)

// RateLimiter — har bir mijoz uchun ruxsat etilgan so'rovlar sonini kuzatadi
type RateLimiter struct {
	mu       sync.Mutex
	counts   map[string]int
	maxCount int
}

func NewRateLimiter(maxCount int) *RateLimiter {
	return &RateLimiter{counts: make(map[string]int), maxCount: maxCount}
}

func (rl *RateLimiter) Allow(clientID string) bool {
	rl.mu.Lock()
	defer rl.mu.Unlock()

	if rl.counts[clientID] >= rl.maxCount {
		return false
	}
	rl.counts[clientID]++
	return true
}

func main() {
	limiter := NewRateLimiter(2)

	fmt.Println(limiter.Allow("client-1"))
	fmt.Println(limiter.Allow("client-1"))
	fmt.Println(limiter.Allow("client-1"))
}

Bu — soddalashtirilgan rate limiter: har bir clientID (masalan foydalanuvchi IP-manzili) uchun so'rovlar sonini hisoblab boradi, va maxCountdan oshsa, Allow false qaytaradi. sync.Mutex ishlatilgani (RWMutex emas) — bu yerda deyarli har bir chaqiruv counts xaritasini O'ZGARTIRADI (o'qish bilan birga), shuning uchun o'qish-yozishni ajratishning foydasi yo'q.

Production tizimlarda bu hisoblagichlar odatda VAQT OYNASI bilan (masalan "har daqiqada eng ko'pi bilan 10 ta so'rov") ishlaydi — bizning oddiy versiyamiz esa g'oyani ko'rsatish uchun hisoblagichni faqat CHEKSIZ oshirib boradi. Bu rate limiter'ni makeShortenHandlerga "HTTP Service Communication" darsidagi kabi PARAMETR sifatida berib, har bir so'rovdan oldin Allow tekshirilishi mumkin.

>_ Exercise

RateLimiter'ga hisoblagichlarni tozalash (Reset) imkonini qo'shing.

  • Reset(clientID string) metodini yozing: delete(rl.counts, clientID) qiling (mu.Lock bilan himoyalab)
  • "client-1" uchun Allow'ni 2 marta chaqiring (ikkalasi ham true bo'lishi kerak), so'ng Reset qiling
  • Reset'dan keyin yana Allow("client-1") ni chaqirib, natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Rate limiting — har bir mijoz uchun so'rovlar sonini hisoblab, belgilangan chegaradan oshganda so'rovlarni rad etib, xizmatni ortiqcha yuklanishdan himoya qiladi.

NEXT UP

Putting It All Together

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Rate Limiting

So'rovlar tezligini cheklash

Konsertga bilet sotuvchi bitta kassa oynasi orqali soatiga cheklangan miqdorda bilet sota oladi — agar hamma birdan bostirib kirsa, tizim tanga aylanadi. Rate Limiting (tezlikni cheklash) — bizning /shorten endpoint'imizni shu xil "bostirib kirish"dan (yoki xato/tajovuzkor kod tomonidan ortiqcha so'rov yuborilishidan) himoya qiladi.

example.go
package main

import (
	"fmt"
	"sync"
)

// RateLimiter — har bir mijoz uchun ruxsat etilgan so'rovlar sonini kuzatadi
type RateLimiter struct {
	mu       sync.Mutex
	counts   map[string]int
	maxCount int
}

func NewRateLimiter(maxCount int) *RateLimiter {
	return &RateLimiter{counts: make(map[string]int), maxCount: maxCount}
}

func (rl *RateLimiter) Allow(clientID string) bool {
	rl.mu.Lock()
	defer rl.mu.Unlock()

	if rl.counts[clientID] >= rl.maxCount {
		return false
	}
	rl.counts[clientID]++
	return true
}

func main() {
	limiter := NewRateLimiter(2)

	fmt.Println(limiter.Allow("client-1"))
	fmt.Println(limiter.Allow("client-1"))
	fmt.Println(limiter.Allow("client-1"))
}

Bu — soddalashtirilgan rate limiter: har bir clientID (masalan foydalanuvchi IP-manzili) uchun so'rovlar sonini hisoblab boradi, va maxCountdan oshsa, Allow false qaytaradi. sync.Mutex ishlatilgani (RWMutex emas) — bu yerda deyarli har bir chaqiruv counts xaritasini O'ZGARTIRADI (o'qish bilan birga), shuning uchun o'qish-yozishni ajratishning foydasi yo'q.

Production tizimlarda bu hisoblagichlar odatda VAQT OYNASI bilan (masalan "har daqiqada eng ko'pi bilan 10 ta so'rov") ishlaydi — bizning oddiy versiyamiz esa g'oyani ko'rsatish uchun hisoblagichni faqat CHEKSIZ oshirib boradi. Bu rate limiter'ni makeShortenHandlerga "HTTP Service Communication" darsidagi kabi PARAMETR sifatida berib, har bir so'rovdan oldin Allow tekshirilishi mumkin.

>_ Exercise

RateLimiter'ga hisoblagichlarni tozalash (Reset) imkonini qo'shing.

  • Reset(clientID string) metodini yozing: delete(rl.counts, clientID) qiling (mu.Lock bilan himoyalab)
  • "client-1" uchun Allow'ni 2 marta chaqiring (ikkalasi ham true bo'lishi kerak), so'ng Reset qiling
  • Reset'dan keyin yana Allow("client-1") ni chaqirib, natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Rate limiting — har bir mijoz uchun so'rovlar sonini hisoblab, belgilangan chegaradan oshganda so'rovlarni rad etib, xizmatni ortiqcha yuklanishdan himoya qiladi.

NEXT UP

Putting It All Together