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