उदाहरण: asynq सर्वर को कार्य प्रसंस्करण दर सीमित करने के लिए विन्यास का उदाहारण

इस पृष्ठ में दिखाया गया है कि asynq सर्वर को कार्य प्रसंस्करण दर सीमित करने के लिए कैसे विन्यास करें।

कृपया ध्यान दें कि यह प्रत्येक सर्वर इंस्टेंस के लिए दर सीमा है, यह सामान्य दर सीमा नहीं है।

इस उदाहरण में, हम 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
}