ڈیفالٹ بہاؤ
اصول طور پر، asynq
ایک کام کو زیادہ سے زیادہ 25 بار دوبارہ کرنے کی کوشش کرتا ہے۔ ہر بار جب کام دوبارہ کرایا جاتا ہے، یہ دوبارہ کرانے کے لیے ایک ایکسپونینشل بیکاف ریت کے طریقے سے دوبارہ کرانے کا وقت فیصلہ کرتا ہے۔ اگر کوئی کام اپنی تمام دوبارہ کرانے کی کوششیں ختم کردیں (اصولی طور پر 25 بار)، تو وہ کام آرکائیو حالت میں منتقل ہوجائے گی تاکہ معائنے اور تشخیصی مقاصد کے لیے اور خود بخود دوبارہ کرایا نہیں جائے گا (آپ اس کام کو 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 ایکس_bar ہونے کی تعداد ہے
// e ایکس_bar ہینڈلر سے واپس آنے والا خرابی
// t متعلقہ کام ہے
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{
// "foo" کاموں کے لیے ، ہمیشہ 2 سیکنڈ کا تاخیر استعمال کریں۔ دیگر کاموں کو اصولی طور پر فعالیت استمال کرتی ہے
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
فنکشن ہوگا۔ یہ پريڈیکیٹ فنکشن فیصلہ کرتا ہے کہ ہینڈلر سے خطا کیا گیا کوی فیلر ہوگا یا نہیں۔ اگر یہ فنکشن جھوٹا واپس کرتا ہے (یعنی، کوئی ناکامی کی خطا نہیں)، تو سرور کام کی دوبارہ کرنے والی تعداد کو استعمال نہیں کرے گا اور کام کو سیدھے طور پر دوبارہ کرنے کے لیے منظم کریں گے۔
مثال:
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 {
// یہاں ٹاسک ہینڈلنگ منطق ہے ...
// اگر ہینڈلر جانتا ہے کہ کام دوبارہ کرنا نہیں چاہتا ہے تو SkipRetry واپسی کریں
return fmt.Errorf(": %w", asynq.SkipRetry)
}