golang.org/x/time/rate
استخدم محدّد معدل الطلبات
golang.org/x/time/rate درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
حزمة rate
توفر golang.org/x/time/rate أداة Limiter جاهزة للاستخدام في بيئة الإنتاج، وتستخدم نموذج دلو الرموز. وهي الخيار القياسي لتحديد المعدل في Go.
- تنفيذ مُجرَّب في ظروف عديدة
- توفر أساليب Allow وWait وReserve
- تدعم السياق
إنشاء Limiter
تستقبل rate.NewLimiter معدلًا (رموزًا في الثانية) وحجم اندفاع. ويمثل rate.Limit عدد الأحداث في الثانية من النوع float64.
limiter := rate.NewLimiter(rate.Limit(10), 5)rate.Every
إذا كنتم تفكرون بالفواصل الزمنية بدلًا من المعدلات لكل ثانية، فإن rate.Every يحوّل مدةً إلى معدل. فعنصر واحد كل 200ms يساوي خمسة عناصر في الثانية.
limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)Allow
تُبلغ Allow عما إذا كان هناك رمز متاح الآن. فتُرجع true وتستهلك رمزًا، أو تُرجع false فورًا. استخدموها لرفض الطلبات الزائدة.
if !limiter.Allow() {
fmt.Println("rejected: too many requests")
return
}Wait
توقف Wait التنفيذ حتى يتوفر رمز أو يُلغى السياق. وهي مناسبة عندما تريدون تنظيم وتيرة العمل بدلًا من إسقاطه.
if err := limiter.Wait(ctx); err != nil {
return err
}
doWork()Reserve
تُرجع Reserve قيمة Reservation تصف مدة الانتظار. استدعوا Delay() لمعرفة مدة الانتظار، وCancel() إذا قررتم عدم المتابعة.
r := limiter.Reserve()
if !r.OK() {
return
}
time.Sleep(r.Delay())ملاحظة: حزمة خارجية
حزمة rate ليست جزءًا من المكتبة القياسية، لذلك تتطلب go get golang.org/x/time/rate ووحدة نمطية. والمقتطفات التي تستوردها توضيحية ولا تُشغَّل مباشرةً هنا.
بديل قابل للتشغيل من المكتبة القياسية
بما أن حزمة rate خارجية، إليكم حلقة لتنظيم الوتيرة باستخدام المكتبة القياسية، وتحاكي Wait عبر إصدار إشارة زمنية كل 200ms.
package main
import (
"fmt"
"time"
)
func main() {
tick := time.NewTicker(200 * time.Millisecond)
defer tick.Stop()
for i := 0; i < 4; i++ {
<-tick.C
fmt.Println("processed event", i)
}
}الضبط أثناء التشغيل
يمكنكم تغيير الحدود أثناء التشغيل باستخدام SetLimit وSetBurst. ويفيد ذلك عند إعادة تحميل الإعدادات أو عندما تخبركم استجابة 429 من الجهة السابقة بضرورة إبطاء الوتيرة.
limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)محدِّدات لكل عميل
احتفظوا بخريطة تربط مفتاح العميل بـ *rate.Limiter، مع حمايتها بقفل. أنشئوا محدِّدًا عند أول طلب لذلك المفتاح، ثم أعيدوا استخدامه في الطلبات اللاحقة.
func getLimiter(m map[string]*rate.Limiter, key string) *rate.Limiter {
if l, ok := m[key]; ok {
return l
}
l := rate.NewLimiter(rate.Limit(5), 10)
m[key] = l
return l
}البرمجيات الوسيطة لـ HTTP
غلّفوا المعالجات بحيث يستدعي كل طلب Allow() أولًا. عند الحصول على false، أرسلوا استجابة HTTP 429 Too Many Requests. هذا هو الأسلوب المعياري لتحديد معدل الطلبات على جانب الخادم.
تحقق سريع
اختبروا معرفتكم بحزمة تحديد معدل الطلبات.
مراجعة
لقد تعلّمتم استخدام golang.org/x/time/rate:
- تنشئ NewLimiter(rate, burst) الحاوية
- تحوّل rate.Every الفاصل الزمني إلى معدل
- ترفض Allow الطلب، وتضبط Wait وتيرة الطلبات، ويبلغ Reserve عن التأخير
- تضبط SetLimit وSetBurst الإعدادات أثناء التشغيل
- استخدام خريطة لكل عميل مع HTTP 429 على الخوادم
الأسئلة الشائعة
هل درس «golang.org/x/time/rate» مجاني؟
نعم — نص درس «golang.org/x/time/rate» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «golang.org/x/time/rate»؟
استخدم محدّد معدل الطلبات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «golang.org/x/time/rate»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مفهوم دلو الرموز
- golang.org/x/time/rate
- خنق Goroutines
- التراجع وإعادة المحاولة