Go (Golang) में रेट लिमिटिंग: लाइब्रेरीज़, पैटर्न और कार्यान्वयन उदाहरण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go (Golang) में रेट लिमिटिंग: लाइब्रेरीज़, पैटर्न और कार्यान्वयन उदाहरण



रेट लिमिटिंग (अनुरोध गति सीमा) आधुनिक वेब सेवाओं और माइक्रोसर्विस आर्किटेक्चर में सुरक्षा और लोड नियंत्रण के प्रमुख तंत्रों में से एक है। Go (Golang) इकोसिस्टम में रेट लिमिटिंग को लागू करने के लिए कई परिपक्व उपकरण मौजूद हैं, जिनमें अंतर्निहित time पैकेज से लेकर golang.org/x/time/rate जैसी विशेष लाइब्रेरीज़ शामिल हैं। इस लेख में, हम विस्तार से समझेंगे कि Go में रेट लिमिटिंग कैसे काम करता है, किन लाइब्रेरीज़ का उपयोग करना है, और व्यावहारिक कोड उदाहरण प्रस्तुत करेंगे।



रेट लिमिटिंग क्या है और इसकी आवश्यकता क्यों है?



रेट लिमिटिंग एक तकनीक है जो एक निश्चित समय अवधि में क्लाइंट द्वारा सर्वर पर किए जा सकने वाले अनुरोधों की संख्या को नियंत्रित करती है। मुख्य उद्देश्य:

  • DDoS हमलों से सुरक्षा — सर्वर ओवरलोड को रोकना।
  • संसाधनों का उचित वितरण — "भूखे" क्लाइंट्स को सीमित करना।
  • SLA का अनुपालन — सभी उपयोगकर्ताओं के लिए उपलब्धता की गारंटी।
  • लागत बचत — डेटाबेस और बाहरी API पर लोड कम करना।


Go में, रेट लिमिटिंग टोकन बकेट और लीकी बकेट एल्गोरिदम का उपयोग करके कार्यान्वित की जाती है। टोकन बकेट सबसे लोकप्रिय है।



लाइब्रेरी golang.org/x/time/rate



Go में रेट लिमिटिंग के लिए मुख्य और अनुशंसित लाइब्रेरी golang.org/x/time/rate है। यह टोकन बकेट एल्गोरिदम को लागू करती है और Go पैकेजों (उप-रिपॉजिटरी) के विस्तारित सेट का हिस्सा है।



स्थापना:

go get golang.org/x/time/rate


मुख्य घटक

  • rate.Limiter — मुख्य सीमक वस्तु।
  • rate.NewLimiter(r rate.Limit, b int) — प्रति सेकंड r अनुरोधों की दर और b आकार की बाल्टी के साथ एक लिमिटर बनाता है।
  • Allow() — जाँचता है कि क्या अभी अनुरोध निष्पादित किया जा सकता है (गैर-अवरोधक)।
  • Wait(ctx) — तब तक निष्पादन को अवरुद्ध करता है जब तक कोई उपलब्ध टोकन न हो (संदर्भ को ध्यान में रखता है)।
  • Reserve() — एक Reservation लौटाता है, जो निष्पादन को स्थगित करने की अनुमति देता है।


उदाहरण 1: बुनियादी रेट लिमिटर

package main

import ( "fmt" "golang.org/x/time/rate" "time")

func main() { // 2 अनुरोध प्रति सेकंड, 5 टोकन की बाल्टी limiter := rate.NewLimiter(2, 5)

for i := 0; i < 10; i++ { if limiter.Allow() { fmt.Printf("अनुरोध %d निष्पादित", i) } else { fmt.Printf("अनुरोध %d अस्वीकृत (सीमा)", i) } time.Sleep(200 * time.Millisecond) }}


उदाहरण 2: प्रतीक्षा (Wait) के साथ रेट लिमिटर

package main

import ( "context" "fmt" "golang.org/x/time/rate" "time")

func main() { limiter := rate.NewLimiter(1, 3) // 1 अनुरोध प्रति सेकंड, 3 की बाल्टी ctx := context.Background()

for i := 0; i < 6; i++ { err := limiter.Wait(ctx) if err != nil { fmt.Println("प्रतीक्षा त्रुटि:", err) return } fmt.Printf("अनुरोध %d %s पर निष्पादित", i, time.Now().Format("15:04:05.000")) }}


रेट लिमिटिंग के साथ HTTP मिडलवेयर का कार्यान्वयन



व्यवहार में, रेट लिमिटिंग अक्सर HTTP सर्वर स्तर पर लागू की जाती है। आइए Gin या मानक net/http के लिए मिडलवेयर का एक उदाहरण देखें।



package main

import ( "net/http" "golang.org/x/time/rate")

// RateLimiterMiddleware रेट लिमिट के साथ मिडलवेयर लौटाता हैfunc RateLimiterMiddleware(r rate.Limit, b int) func(http.Handler) http.Handler { limiter := rate.NewLimiter(r, b) return func(next http.Handler) http.Handler { return http.HandlerFunc(f

अनुशंसाएँ