Asynq-এ ইউনিক টাস্ক ফিচার নিশ্চিত করে যে রেডিস কিউতে শুধুমাত্র একটি টাস্ক আছে।
যখন আপনি কাজগুলির ডিডুপ্লিকেশন করতে এবং ডুপ্লিকেট কাজগুলি এড়িয়ে ফেলতে চান, তখন এই ফিচার খুব দরকার।
সারসংক্ষেপ
এসিংকএ-এ টাস্কের অননুযায়ী অননুযায়ীতা নিশ্চিত করার জন্য দুটি পদ্ধতি আছে।
-
TaskID
অপশন ব্যবহার করে: নিজের মধ্যে একটি অননুযায়ী টাস্ক আইডি তৈরি করুন। -
Unique
অপশন ব্যবহার করে: এসিংকএ একটি অননুযায়ীতা লক তৈরি করুন।
TaskID
অপশন ব্যবহার করা
যদি আপনি প্রথম পদ্ধতিটি চয়ন করেন, তবে আপনি নিশ্চিত করতে পারেন যে সময়ের মধ্যে প্রদত্ত টাস্ক আইডিতে একটি টাস্ক আছে। যদি আপনি একই টাস্ক আইডিতে আরও একটি টাস্ক ইনকিউএন করার চেষ্টা করেন, তবে এটি একটি ErrTaskIDConflict
ত্রুটি রিটার্ন করবে।
// প্রথম টাস্কটি ঠিক হতে চাইবে
_, ত্রুটি := client.Enqueue(task, asynq.TaskID("mytaskid"))
// দ্বিতীয় টাস্ক ব্যর্থ হবে, ত্রুটি হবে ErrTaskIDConflict (যদি মনে রাখা যায় যে প্রথম টাস্কটি এখনো প্রসেস হয়নি)
_, ত্রুটি = client.Enqueue(task, asynq.TaskID("mytaskid"))
Unique
অপশন ব্যবহার করা
দ্বিতীয় পদ্ধতি ভিত্তি করে অননুযায়ীতা লক। একটি টাস্ক ইন্কিউএন করার সময় Unique
অপশন ব্যবহার করা হলে, ক্লায়েন্ট চেক করবে তা কি প্রদত্ত টাস্কের জন্য লক অর্জন করতে পারে। টাস্কটি শুধুমাত্র যদি লকটি অর্জন করা যায় তবে ইনকিউএনে হবে। যদি অন্য কোনও টাস্ক ইতিমধ্যে সে লক ধরে রাখে, তাহলে ক্লায়েন্ট একটি ত্রুটি রিটার্ন করবে (নিচের উদাহরণ কোডে ত্রুটি চেক করার পদ্ধতি দেখুন)।
অননুযায়ীতা লকটি সন্তানের জন্য একটি টিটিএল (সময় বা থাকার সময়) সহ। লকটি টিটিএল শেষ হবে এবং টাস্কটি টিটিএল শেষ হওয়ার পরে বৃহত্তর প্রক্রিয়া হয়নি।
এসিংকএ-এ ইউনিক টাস্ক ফিচারের একটি গুরুত্বপূর্ণ জিনিস হলো সেরা যাচাই এসো। অর্থাত, যদি লক যাতে দুর্ভাগ্যবশ্যক প্রক্রিয়ায়ন হওয়ার আগে এর মেয়াদ শেষ হয়ে যায়, তবে একটি ডুপ্লিকেট টাস্ক ইনকিউএন করা হতে পারে।
টাস্কের অননুযায়ীতা নিম্নলিখিত বৈশিষ্ট্যগুলির ভিত্তিতে:
- ধরণ
- পেলোড
- কিউ
তাই, যদি একই ধরণের এবং পেলোডের কাজগুলি একই কিউতে ইনকিউএন করা হয়, তাহলে ব্যর্থ হওয়া পর্যন্ত অন্য বৈশিষ্ট্যগুলির সাথে মিলিত একটি টাস্ক ইনকিউএন করা হবে না।
c := asynq.NewClient(redis)
t1 := asynq.NewTask("example", []byte("hello"))
// t1 পরবর্তী ঘন্টার জন্য অননুযায়ীতা লক ধরবে।
err := c.Enqueue(t1, asynq.Unique(time.Hour))
switch {
case errors.Is(err, asynq.ErrDuplicateTask):
// ডুপ্লিকেট টাস্ক হ্যান্ডেল করুন
case err != nil:
// অন্যান্য ত্রুটিগুলি হ্যান্ডেল করুন
}
t2 := asynq.NewTask("example", []byte("hello"))
// টি ২ টি টি এর পুনরায় ইনকিউএন করা যাবে না যদি তা টির এক ডুপ্লিকেট হয়ে
err = c.Enqueue(t2, asynq.Unique(time.Hour))
switch {
case errors.Is(err, asynq.ErrDuplicateTask):
// ডুপ্লিকেট টাস্ক হ্যান্ডেল করুন
case err != nil:
// অন্যান্য ত্রুটিগুলি হ্যান্ডেল করুন
}
উপরের উদাহরণে, t2
t1
এর একটি ডুপ্লিকেট হিসাবে ইনকিউএন করা হবে না। আপনি প্রত্যাবর্তন কমান্ডের উপরে ফিরে চলতে errors.Is
ব্যবহার করতে পারেন যাতে দেখা যায় রিটার্ন করা ত্রুটি
মানটি asynq.ErrDuplicateTask
ত্রুটিকে কাভার করে কিনা।