9.4.18.1 توضیحات #
الگوی Rate Limiting برای کنترل تعداد درخواستها یا وظایف همزمان در یک بازه زمانی مشخص استفاده میشود. این الگو با استفاده از یک time.Ticker
یا روشهای مشابه، اجرای گوروتینها یا پردازش دادهها را محدود میکند. این امر به جلوگیری از بارگذاری بیش از حد سیستم یا رعایت محدودیتهای اعمالشده توسط یک API کمک میکند. این الگو در بسیاری از برنامههای عملی مانند API throttling یا پردازش درخواستهای ورودی پرکاربرد است.
9.4.18.2 دیاگرام #
flowchart TD
A[شروع] -->|درخواستهای ورودی| B[کانال درخواستها]
B --> C{Rate Limiter}
C -->|ارسال درخواست مجاز| D[پردازش درخواست]
C -->|رد درخواست اضافی| E[لغو درخواست]
D --> F[ارسال نتیجه]
9.4.18.3 نمونه کد #
1package main
2
3import (
4 "fmt"
5 "time"
6)
7
8func processRequest(id int) {
9 fmt.Printf("Processing request %d at %s\n", id, time.Now().Format("15:04:05"))
10}
11
12func main() {
13 const requestLimit = 3
14 const interval = time.Second
15
16 ticker := time.NewTicker(interval)
17 defer ticker.Stop()
18
19 requests := make(chan int, requestLimit)
20
21 // Producer: ارسال درخواستها به کانال
22 go func() {
23 for i := 1; i <= 10; i++ {
24 requests <- i
25 }
26 close(requests)
27 }()
28
29 // Consumer: پردازش درخواستها با استفاده از Rate Limiter
30 for request := range requests {
31 <-ticker.C
32 processRequest(request)
33 }
34}
1$ go run main.go
2Processing request 1 at 12:00:00
3Processing request 2 at 12:00:01
4Processing request 3 at 12:00:02
5Processing request 4 at 12:00:03
6Processing request 5 at 12:00:04
در کد فوق، برای پردازش هر درخواست تنها اجازه اجرا در هر بازه یک ثانیه داده میشود. این کار با استفاده از time.Ticker
انجام شده است.
9.4.18.4 کاربردها #
- Throttling API Calls: در زمانی که شما نیاز دارید درخواستهای API را محدود کنید تا از محدودیتهای تعیینشده توسط ارائهدهنده API تجاوز نکنید.
- کنترل بار سیستم: برای جلوگیری از استفاده بیش از حد از منابع سیستم، مانند پردازنده یا پایگاه داده.
- پردازش دادههای ورودی: زمانی که دادههای ورودی بسیار سریعتر از ظرفیت پردازش وارد میشوند، این الگو میتواند سرعت پردازش را مدیریت کند.
- زمانبندی رویدادها: برای انجام عملیات در فواصل زمانی معین مانند ارسال ایمیلهای گروهی.