Cleaning Up Idle Limiters
Bo'sh turgan limiterlarni tozalash
Per-Key Rate Limiting darsida siz har bir yangi klient uchun savat yaratdingiz, lekin ularni hech qachon o'chirmadingiz. Uzoq muddat ishlaydigan serverda millionlab bir martalik klientlar (masalan, tasodifiy IP manzillar) buckets map'ini abadiy o'stirib, xotirani sekin-asta "oqizib" yuboradi (memory leak).
Yechim — har bir klientning oxirgi ko'rilgan vaqtini kuzatib borish va vaqti-vaqti bilan uzoq vaqt faol bo'lmagan (idle) yozuvlarni tozalash:
func CleanupIdle(lastSeen map[string]int64, now int64, idleSeconds int64) []string {
removed := []string{}
for key, seen := range lastSeen {
if now-seen >= idleSeconds {
removed = append(removed, key)
}
}
for _, key := range removed {
delete(lastSeen, key)
}
return removed
}E'tibor bering: funksiya avval qaysi kalitlarni o'chirish kerakligini aniqlaydi, keyingina ularni o'chiradi — bu Composite Types kursidagi "tsikl davomida map'ni o'zgartirmang" ogohlantirishining amaliy qo'llanilishi: Go'da range paytida map'dan delete qilish texnik jihatdan xavfsiz bo'lsa-da, tekshirish va o'chirishni alohida bosqichlarga ajratish kodni ancha tushunarli qiladi.
>_ Exercise
CleanupIdle(lastSeen map[string]int64, now int64, idleSeconds int64) []string funksiyasini yozing. lastSeendagi har bir kalit uchun, agar now - seen >= idleSeconds bo'lsa, uni o'chirilishi kerak bo'lganlar ro'yxatiga qo'shing. Barcha aniqlangan kalitlarni lastSeendan o'chiring, so'ngra ularni alifbo tartibida saralab (sort.Strings) qaytaring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Uzoq muddat ishlaydigan xizmatlar ko'pincha "oxirgi ko'rilgan vaqt" kabi metama'lumotlarni saqlab, davriy tozalash orqali xotira sarfini nazorat qilishi kerak. Avval o'chiriladiganlarni aniqlab, keyin o'chirish — bu turdagi tozalash mantig'ini yozishning aniq va xavfsiz usuli.
NEXT UP
Project: HTTP Middleware Rate Limiter
$ go run main.go
Kodingizni ishga tushiring