تسریعی سرور کی تشکیل دینے کا مثال تسک پروسیسنگ کی شرح محدود کرنے کی پیادہ
اس صفحہ پر دکھایا گیا ہے کہ تسریعی سرور کو کیسے تشکیل دی جائے تاکہ تسک پروسیسنگ کی شرح محدود ہو سکے۔
براہ کرم نوٹ کریں کہ یہ ہر سرور نمائندہ کیلئے محدودیت ہے، یہ عام محدودیت نہیں ہے۔
اس مثال میں ہم golang.org/x/time/rate
پیکیج استعمال کریں گے تاکہ ہم شرح محدودیت کا دکھاؤ کرسکیں۔ آپ کے سرور کی شروعاتی ترتیبات میں اہم ترین ترتیبات IsFailure
اور RetryDelayFunc
ہیں۔ ہم ایک کسٹم غلطی کی قسم بنائیں گے اور IsFailure
اور RetryDelayFunc
فنکشن میں دی گئی غلطی کی تصدیق کریں گے۔
package main
import (
"context"
"errors"
"fmt"
"log"
"math/rand"
"time"
"golang.org/x/time/rate"
"github.com/hibiken/asynq"
)
func main() {
srv := asynq.NewServer(
asynq.RedisClientOpt{Addr: ":6379"},
asynq.Config{
Concurrency: 10,
// اگر یہ شرح محدودیت کی وجہ سے ہو تو توقف کو ناکامی کا حساب نہیں کیا گا۔
IsFailure: func(err error) bool { return !IsRateLimitError(err) },
RetryDelayFunc: retryDelay,
},
)
if err := srv.Run(asynq.HandlerFunc(handler)); err != nil {
log.Fatal(err)
}
}
type RateLimitError struct {
RetryIn time.Duration
}
func (e *RateLimitError) Error() string {
return fmt.Sprintf("شرح محدودیت تک پہنچ گئی ہے (دوبارہ کوشش کریں %v)", e.RetryIn)
}
func IsRateLimitError(err error) bool {
_, ok := err.(*RateLimitError)
return ok
}
func retryDelay(n int, err error, task *asynq.Task) time.Duration {
var ratelimitErr *RateLimitError
if errors.As(err, &ratelimitErr) {
return ratelimitErr.RetryIn
}
return asynq.DefaultRetryDelayFunc(n, err, task)
}
// ہر سیکنڈ 10 واقعات کی شرح محدودیت، 30 واقعات تک کی اجازت دی جاتی ہے۔
var limiter = rate.NewLimiter(10, 30)
func handler(ctx context.Context, task *asynq.Task) error {
if !limiter.Allow() {
return &RateLimitError{
RetryIn: time.Duration(rand.Intn(10)) * time.Second,
}
}
log.Printf("[*] ٹاسک %s کا نمائندہ کررہا ہے", task.Payload())
return nil
}