एसिंक में अद्वितीय कार्य सुनिश्चित करने की विशेषता यह सुनिश्चित करती है कि रेडिस कतार में केवल एक ही कार्य हो।
जब आप कार्यों को डीडुप्लीकेट करना चाहते हैं और डुप्लीकेट कार्यों से बचना चाहते हैं, तो यह सुनिश्चित करने की विशेषता बहुत उपयोगी है।
अवलोकन
एसिंक में कार्य के अद्वितीयता सुनिश्चित करने के लिए दो तरीके हैं।
-
TaskID
विकल्प का उपयोग: खुदसे एक अद्वितीय कार्य आईडी उत्पन्न करें। -
Unique
विकल्प का उपयोग: एसिंक द्वारा कार्य के लिए एक अद्वितीयता ताला बनाएँ।
TaskID
विकल्प का उपयोग
अगर आप पहले तरीका चुनते हैं, तो आप सुनिश्चित कर सकते हैं कि किसी अनुपलब्ध समय पर दिए गए कार्य आईडी के साथ केवल एक कार्य है। यदि आप एक और कार्य को उसी कार्य आईडी के साथ दर्ज करने का प्रयास करते हैं, तो यह एक ErrTaskIDConflict
त्रुटि वापस करेगा।
// The first task should be fine
_, err := client.Enqueue(task, asynq.TaskID("mytaskid"))
// The second task will fail, err will be ErrTaskIDConflict (assuming the first task has not been processed yet)
_, err = client.Enqueue(task, asynq.TaskID("mytaskid"))
Unique
विकल्प का उपयोग
दूसरा तरीका अद्वितीयता ताले पर आधारित है। Unique
विकल्प का उपयोग करके एक कार्य को दर्ज करते समय, Client
यह जांचेगा कि क्या वह दिए गए कार्य के लिए ताला प्राप्त कर सकता है या नहीं। केवल तब कार्य को दर्ज किया जाएगा अगर ताला प्राप्त किया जा सकता है। अगर दूसरा कार्य पहले से ही ताले में है, तो Client
एक त्रुटि वापस करेगा (त्रुटि की जांच के लिए नीचे दिए गए उदाहरण को देखें)।
अद्वितीयता ताला के साथ एक TTL (समय तक जीने) जुड़ा होता है ताकि ताला को स्थायी रूप से धारण नहीं किया जा सके। ताला TTL के बाद या ताला को पहले से ही सफलतापूर्वक प्रसंस्कृत कर दिया गया हो, ताला रिलीज कर दिया जाएगा।
एक महत्वपूर्ण बात यह भी है कि एसिंक में अद्वितीय कार्य सुनिश्चित करने की विशेषता सर्वनशस्त-प्रयास अद्वितीयता पर आधारित है। अन्य शब्दों में, यदि कार्य प्रसंस्कृत होने से पहले ताला समाप्त हो गया है, तो एक प्रतिलिपि कार्य दर्ज की जा सकती है।
कार्य की अद्वितीयता निम्नलिखित गुणों पर आधारित है:
- प्रकार
- पेलोड
- कतार
इसलिए, यदि उसी प्रकार और पेलोड के कार्यों को समान कतार में दर्ज किया गया हो, तो ताला रिलीज नहीं होने के कारण अन्य कार्य को दर्ज नहीं किया जाएगा।
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"))
// t2 उसी कार्य की प्रतिलिपि होने के कारण दर्ज नहीं किया जा सकता है।
err = c.Enqueue(t2, asynq.Unique(time.Hour))
switch {
case errors.Is(err, asynq.ErrDuplicateTask):
// डुप्लिकेट कार्य का सामना करें
case err != nil:
// अन्य त्रुटियों का सामना करें
}
उपरोक्त उदाहरण में, t2
को t1
की प्रतिलिपि होने के कारण दर्ज नहीं किया जाएगा। आप errors.Is
का उपयोग करके वापस आने वाली error
मान से जांच कर सकते हैं कि क्या यह asynq.ErrDuplicateTask
त्रुटि को लपेटती है।