ডিফল্ট আচরণ

ডিফল্টভাবে, asynq একটি কাজকে সর্বাধিক ২৫ বার পুনরায় চেষ্টা করবে। প্রতিবার কাজটি পুনরায় চেষ্টা করা হলে, পুনরায় চেষ্টার বিরাম পেতে একটি বৃদ্ধির্ষ পিছু পিছু ব্যবহার করে। যদি কোনো কাজ তার সমস্ত পুনরায় চেষ্টার সময় শেষ করে (ডিফল্টভাবে ২৫ বার), তাহলে সেই কাজটি পরীক্ষার এবং পর্যবেক্ষণের উদ্দেশ্যে আর্কাইভড অবস্থায় চলে যাবে, এবং সবগুলি পুনরায় চেষ্টা স্বতঃমাতে হবে না (আপনি এখনো 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 হল কতবার কাজটি পুনরায় চেষ্টা করা হয়েছে
// e হল কাজের হ্যান্ডলার দ্বারা ফেরৎযো ত্রুটি
// 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" কাজের জন্য সর্বদা একটি মেয়াদ বাড়ান: অন্য কাজ ডিফল্ট আচরণ ব্যবহার করে।
    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 প্রদান করা যেতে পারে যে “ব্যর্থতা “(ত্রুটি) ফাংশনের জন্য। এই অধিকারী ফাংশনটি নির্ধারণ করে, হ্যান্ডলার হতে আসা ত্রুটি কি একটি বিফল ত্রুটি হিসাবে গণনা করে তা। যদি ফাংশনটি মিথ্যা প্রদান করে (অর্থাৎ, একটি বিফল ত্রুটি), তাহলে পরিষেবকটি কাজের পুনরায় চেষ্টা গণনা ব্যবহার করবে না এবং শুধুমাত্র পুনরায় চেষ্টা করা জনন্য অনুসন্ধান করবে।

উদাহরণ:

var ErrResourceNotAvailable = errors.New("কোনো সম্পদ পাওয়া যায়নি")

func HandleResourceIntensiveTask(ctx context.Context, task *asynq.Task) error {
    if !সম্পদটি পাওয়া যাচ্ছে() {
        return ErrResourceNotAvailable
    }
    // ... সম্পদ উন্নয়ন কাজের জন্য লজিক
}

// ...

srv := asynq.NewServer(redisConnOpt, asynq.Config{
    // ... অন্যান্য কনফিগারেশন অপশনগুলি
    IsFailure: func(err error) bool {
        return err != ErrResourceNotAvailable // সাধারণভাবে ত্রুটি নয় যদি কোনো সম্পদ পাওয়া যানি
    },
})

পুনরায় চেষ্টা বাদ দিন

যদি Handler.ProcessTask প্রসেস করে স্কিপরিট্রাই ত্রুটি রিটার্ন করলে, তবে বাকি থাকা পুনরায় চেষ্টা গণনা করা না মন্ত্রণ ধারণ করা হবে। ফিরোয়ার্ড করা ত্রুটি হতে পারে স্কিপরিট্রাই বা স্কিপরিট্রাই ত্রুটি জাদুকরে অরুপিত হয়েছে।

func ExampleHandler(ctx context.Context, task *asynq.Task) error {
    // কাজ সংলাপ লজিক এখানে ...
    // যদি হ্যান্ডলার জানে যে কাজটি পুনরায় চেষ্টা করা উচিত নয়, তাহলে দ্বিধা করুন
    return fmt.Errorf(": %w", asynq.SkipRetry)
}