इस पेज में वर्णित किया गया है कि कैसे टास्क पुनः प्रयासित कॉन्फ़िगर किया जाए।

डिफॉल्ट व्यवहार

डिफ़ॉल्ट रूप से, asynq प्रत्येक टास्क को अधिकतम 25 बार के लिए पुनः प्रयासित करेगा। हर बार जब टास्क को पुनः प्रयासित किया जाता है, तो पुनः प्रयास संख्या की गणना करने के लिए एक घातांक वापसी रणनीति का उपयोग किया जाता है। यदि कोई टास्क अपनी सभी पुनः प्रयास संभावनाएँ समाप्त कर देता है (डिफ़ॉल्ट रूप में 25 बार), तो उस टास्क को जाँच और डिबगिंग के लिए archived स्थिति में ले जाया जाएगा, और यह स्वचालित रूप से पुनः प्रयासित नहीं किया जाएगा (आप CLI या WebUI का उपयोग करके फिर से टास्क को चला सकते हैं)।

निम्नलिखित टास्क पुनः प्रयासित गुण संशोधित किए जा सकते हैं:

  • प्रत्येक टास्क के लिए अधिकतम पुनः प्रयास संख्या
  • विफलता वाली टास्क को पुनः प्रयास करने से पहले प्रतीक्षा करने की संविदा अंतराल (अर्थात, विलंब)
  • क्या टास्क की पुनः प्रयास संख्या का उपयोग करना है
  • क्या पुनः प्रयासों को छोड़कर और टास्क को सीधे अभिलेख में भेजना है

इस पेज के बाकी भागों में हर विशेष विकल्प की चर्चा की गई है।

टास्क के लिए अधिकतम पुनः प्रयास संख्या संशोधित करना

आप टास्क को इनक्व्यू करते समय टास्क के लिए अधिकतम पुनः प्रयास संख्या को निर्दिष्ट कर सकते हैं asynq.MaxRetry विकल्प का उपयोग करके।

उदाहरण:

client.Enqueue(task, asynq.MaxRetry(5))

इससे यह दर्शाया जाता है कि task को अधिकतम पांच बार पुनः प्रयासित किया जाना चाहिए।

वैकल्पिक रूप से, अगर आप किसी विशेष टास्क के लिए अधिकतम पुनः प्रयास संख्या सेट करना चाहते हैं, तो आप उसे टास्क के लिए डिफ़ॉल्ट विकल्प के रूप में सेट कर सकते हैं।

task := asynq.NewTask("feed:import", nil, asynq.MaxRetry(5))
client.Enqueue(task) // MaxRetry set to 5

पुनः प्रयास विलंब की अनुकूलन

आप Config संरचि में RetryDelayFunc विकल्प का उपयोग करके पुनः प्रयास विलंब कैसे गणित करना है वह निर्धारित कर सकते हैं।

RetryDelayFunc की सिग्नेचर निम्नलिखित है:

// n is the number of times the task has been retried
// e is the error returned by the task handler
// t is the related task
RetryDelayFunc func(n int, e error, t *asynq.Task) time.Duration

उदाहरण:

srv := asynq.NewServer(redis, asynq.Config{
    Concurrency: 20,
    RetryDelayFunc: func(n int, e error, t *asynq.Task) time.Duration {
        return 2 * time.Second
    },
})

इससे सभी विफल टास्क्स को फिर से प्रोसेस किए जाने से पहले दो सेकंड के लिए प्रतीक्षा करनी होगी।

डिफ़ॉल्ट व्यवहार घातांक वापसी द्वारा परिभाषित है, जिसे DefaultRetryDelayFunc द्वारा अनुकूलन करना है। निम्नलिखित उदाहरण दर्शाता है कि कैसे विशेष टास्क प्रकारों के लिए पुनः प्रयास विलंब को अनुकूलित किया जा सकता है:

srv := asynq.NewServer(redis, asynq.Config{
    // For "foo" tasks, always use a 2-second delay, other tasks use the default behavior.
    RetryDelayFunc: func(n int, e error, t *asynq.Task) time.Duration {
        if t.Type() == "foo" {
            return 2 * time.Second 
        }
        return asynq.DefaultRetryDelayFunc(n, e, t) 
    },
})

विफलता वाला त्रुटि

कभी-कभी, आपको हैंडलर से त्रुटि वापस करना चाहिए और टास्क को बाद में पुनः प्रयास करना चाहिए, लेकिन टास्क की पुनः प्रयास संंख्या का उपयोग न करें। उदाहरण के लिए, आप बाद में पुनः प्रयास करना चाहेंगे क्योंकि कार्य इकाइयों के पास टास्क को संभालने के लिए पर्याप्त संसाधन नहीं है। सर्वर प्रारंभ करते समय, आप Config उपलब्ध कराने के लिए IsFailure(error) bool विकल्प का उपयोग कर सकते हैं। इस प्रेडिकेट फ़ंक्शन निर्धारित करता है कि हैंडलर से एक त्रुटि को विफलता के रूप में गिना जाए या नहीं। यदि फ़ंक्शन false लौटाता है (अर्थात, एक विफलता रहित त्रुटि), तो सर्वर टास्क की पुनः प्रयास संख्या का उपयोग नहीं करेगा और टास्क को सीधे पुनः प्रयास करने के लिए अनुसूचित कर देगा।

उदाहरण:

var ErrResourceNotAvailable = errors.New("no resource is available")

func HandleResourceIntensiveTask(ctx context.Context, task *asynq.Task) error {
    if !IsResourceAvailable() {
        return ErrResourceNotAvailable
    }
    // ... logic for handling resource-intensive task
}

// ...

srv := asynq.NewServer(redisConnOpt, asynq.Config{
    // ... other configuration options
    IsFailure: func(err error) bool {
        return err != ErrResourceNotAvailable // non-failure error if no resource is available
    },
})

पुनः प्रयास को छोड़ना

यदि Handler.ProcessTask SkipRetry त्रुटि लौटाता है, तो टास्क को पुनः प्रयासित की बची हुई संख्या का अपेक्षा न करते हुए उसे संरक्षित किया जाएगा। लौटी गई त्रुटि SkipRetry या SkipRetry त्रुटि के साथ वापस लौट सकती है।

func ExampleHandler(ctx context.Context, task *asynq.Task) error {
    // Task handling logic here...
    // If the handler knows the task should not be retried, return SkipRetry
    return fmt.Errorf(": %w", asynq.SkipRetry)
}