अधिकांश एप्लिकेशन को मेलर्स, नियमित क्लीन-अप, या किसी अन्य समय लेने वाले ऑपरेशन के लिए बैकग्राउंड जॉब्स की आवश्यकता होती है जिसमें यूजर का उपस्थित होना आवश्यक नहीं है।
रेल्स की दुनिया में कई जेम्स जॉब क्यू और बैकग्राउंड प्रोसेसिंग का समर्थन करते हैं - डिलेड जॉब और साइडकिक दो सबसे लोकप्रिय हैं।
इस पोस्ट में, हम डिलेड जॉब और साइडकिक पर विस्तार से नज़र डालेंगे, जिसमें वे एक-दूसरे के खिलाफ कैसे खड़े हैं।
चलते हैं!
डिलेड जॉब का त्वरित परिचय
डिलेड जॉब Shopify से एक सीधा निष्कर्षण है और सभी बैकग्राउंड जॉब्स को बनाए रखने के लिए एक टेबल का उपयोग करता है। यह एक बहुत ही सरल पैटर्न का पालन करता है। कोई भी रूबी ऑब्जेक्ट जो perform मेथड का जवाब देता है, उसे जॉब्स टेबल में एन्क्यू किया जा सकता है।
इसके अलावा, यदि आपको स्पेशल जॉब ऑब्जेक्ट्स बनाए रखने की आवश्यकता नहीं है (हालांकि टेस्टेबिलिटी और लंबे समय तक चलने वाले ऑपरेशन के स्पष्ट अलगाव के लिए यह अत्यधिक अनुशंसित है), तो यह आपको किसी भी रूबी ऑब्जेक्ट पर .delay.method(params) कॉल करने की अनुमति देता है। यह मेथड को बैकग्राउंड में प्रोसेस करेगा।
डिलेड जॉब README सभी सामान्य उपयोग पैटर्न की व्याख्या करने का बहुत अच्छा काम करता है।
कई टीमें डिलेड जॉब चुनती हैं क्योंकि यह सरल है और उनके पहले से मौजूद डेटाबेस का उपयोग करता है। उन्हें अन्य संसाधनों को खर्च/बनाए रखने की आवश्यकता नहीं है।
हालांकि, यह अभी भी आपके डेटाबेस टेबल में जगह लेगा। यदि एक ही समय में बहुत सारे जॉब्स क्यूड हैं, तो उन सभी को समायोजित करने के लिए आपको अधिक डिस्क स्थान की आवश्यकता हो सकती है।
साइडकिक का त्वरित परिचय
दूसरी ओर, साइडकिक सभी जॉब मेटाडेटा को बनाए रखने के लिए अपने डेटा स्टोर के रूप में रेडिस का उपयोग करता है। यह नियमित डेटाबेस सिस्टम की तुलना में बहुत तेज़ होने के स्पष्ट लाभ के साथ आता है जिनका उपयोग डिलेड जॉब करता है। इसके अलावा, प्रत्येक साइडकिक प्रोसेस जॉब्स को और भी तेज़ी से प्रोसेस करने के लिए कई थ्रेड्स स्पॉन करता है।
साइडकिक में प्रत्येक बैकग्राउंड जॉब के लिए, हमें एक स्पेशलाइज़्ड क्लास की आवश्यकता होती है जो Sidekiq::Worker कंसर्न को शामिल करती है और perform मेथड का जवाब देती है। जॉब को एन्क्यू करने के लिए, हमें आर्गुमेंट्स के साथ वर्कर पर perform_async(arg1, arg2) कॉल करने की आवश्यकता होती है।
साइडकिक 'गेटिंग स्टार्टेड' गाइड इसे और अन्य उपयोग पैटर्न को अच्छे विवरण में समझाता है।
डिलेड जॉब या साइडकिक के साथ Active Job का उपयोग करना
रेल्स पहले से ही जॉब्स के टॉप-लेवल घोषणा और संचालन के लिए एक परिपक्व जॉब फ्रेमवर्क प्रदान करता है। दोनों डिलेड जॉब और साइडकिक ActiveJob के एकीकृत API के माध्यम से जॉब्स चलाने का समर्थन करते हैं। बस ApplicationJob से विरासत लें और अपने जॉब क्लास पर perform_later कॉल करके जॉब को कॉन्फ़िगर किए गए क्यूइंग बैकएंड में एन्क्यू करें।
Active Job के साथ जॉब्स चलाने का लाभ यह है कि आपका एप्लिकेशन कोड फ्रेमवर्क-अज्ञेय बन जाता है, और डिलेड जॉब से साइडकिक (या इसके विपरीत) पर स्विच करना काफी आसान हो जाता है। ActiveJob::TestHelper एन्क्यूड जॉब्स का टेस्ट करना आसान बनाता है।
लेकिन Active Job द्वारा प्रदान की गई अब्स्ट्रैक्शन भी एक प्रदर्शन ओवरहेड के साथ आती है, क्योंकि जॉब डेटा को स्टोर में पुश करने से पहले लपेटा जाना चाहिए। साइडकिक का दावा है कि रेडिस में पुश करते समय ActiveJob लगभग 2-20x धीमा है, जिसमें ~3x प्रोसेसिंग ओवरहेड है।
डिलेड जॉब्स बनाम साइडकिक
अब जब हम डिलेड जॉब्स और साइडकिक की मूल बातें जानते हैं, तो आइए उनके अंतरों में गहराई से गोता लगाएं और प्रत्येक टेबल पर क्या लाता है।
विशेषताएं
बेसिक एप्लिकेशन के लिए, दोनों साइडकिक और डिलेड जॉब बॉक्स से बाहर सुविधाओं का एक अच्छा सेट प्रदान करते हैं। इनमें जॉब प्राथमिकता असाइन करना, नेम्ड क्यू, और विफलताओं पर ऑटो-रीट्राई शामिल हैं।
डिलेड जॉब बॉक्स से बाहर मैक्स रन टाइम कॉन्फ़िगर करने का एक तरीका भी प्रदान करता है (साइडकिक नहीं करता)।
दूसरी ओर, साइडकिक जॉब मेटाडेटा अपडेट करने, जॉब को क्यूइंग छोड़ने, या जॉब निष्पादित करने के लिए मिडलवेयर के लिए समर्थन प्रदान करता है। साइडकिक अधिक कॉलबैक्स का समर्थन करता है, हालांकि डिलेड जॉब ऐप्स के लिए कुछ हुक उपलब्ध हैं। कॉलबैक्स के बजाय, आप डिलेड जॉब को Active Job (अर्थात्, रेल्स में अंतर्निहित before_enqueue और around_perform कॉलबैक्स) के साथ उपयोग कर सकते हैं।
वेब UI एक और विशेषता है जो साइडकिक के साथ बॉक्स से बाहर आती है। यह जॉब्स के बारे में ऐतिहासिक आंकड़े और वर्कर्स, वर्तमान में एन्क्यूड और डेड जॉब्स के बारे में जानकारी प्रदान करता है। आप कंसोल से गुजरे बिना जॉब्स को डिलीट करने या तुरंत चलाने जैसे ऑपरेशन कर सकते हैं।
डिलेड जॉब में एक अंतर्निहित वेब UI नहीं है, लेकिन delayed_job_web साइडकिक के समान सुविधाओं के साथ एक बेसिक वेब UI तक पहुंच प्रदान करता है।
साइडकिक प्रदर्शन में जीतता है
प्रदर्शन-वार, साइडकिक डिलेड जॉब को काफी ठोस रूप से हराता है। साइडकिक के ओपन-सोर्स बेंचमार्क के अनुसार, यह डिलेड जॉब की तुलना में लगभग 30x तेज है। इसके दो प्रमुख कारण हैं:
- रेडिस पारंपरिक डेटाबेस जैसे Postgres की तुलना में डेटा क्वेरी करने में बहुत तेज है क्योंकि यह डेटा को डिस्क के बजाय मेमोरी में स्टोर करता है।
- डिलेड जॉब जॉब्स प्रोसेस करने के लिए एक सिंगल थ्रेड चलाता है, जबकि साइडकिक कई थ्रेड्स का उपयोग करता है।
जबकि यह सब कागज पर बहुत अच्छा लगता है, अंतर तब तक ज्यादा मायने नहीं रखते जब तक आप बड़े पैमाने पर काम नहीं करते (कुछ ऐसा जैसे 10k जॉब्स प्रति मिनट)। सटीक संख्या जॉब के औसत रन टाइम पर भी निर्भर करती है। रन टाइम जितना लंबा होगा, डिलेड जॉब का प्रदर्शन ओवरहेड उतना कम मायने रखता है।
यदि आप डिलेड जॉब के प्रदर्शन के बारे में चिंतित हैं, तो आप कुछ प्रदर्शन अनुकूलन कर सकते हैं। उपयोग करने के लिए सटीक इंडेक्स आपके जॉब सिस्टम के आंकड़ों पर निर्भर करेंगे। उदाहरण के लिए, यदि आप कई क्यू का उपयोग करते हैं और केवल एक को जॉब्स का बड़ा हिस्सा मिलता है, तो क्यू कॉलम पर एक साधारण इंडेक्स (add_index :delayed_jobs, :queue) प्रदर्शन को काफी सुधार सकता है।
AppSignal में, साइडकिक मैजिक डैशबोर्ड ऑटोमैटिकली जनरेट हो जाता है और यह आपको क्यू लंबाई, क्यू लेटेंसी, जॉब अवधि, जॉब स्टेटस, मेमोरी उपयोग, आदि की निगरानी करने में सक्षम बनाता है।

तैनाती
दोनों डिलेड जॉब और साइडकिक के लिए वर्कर्स की तैनाती रणनीति समान है। Heroku का उपयोग करके, आपको बस अपने Procfile के अंदर एंट्रीज जोड़ने की आवश्यकता है ताकि जॉब प्रोसेसर शुरू हो सके और वर्कर्स चल सकें।
साइडकिक के लिए:
डिलेड जॉब के लिए:
मेमोरी
यहां चीजें थोड़ी अधिक दिलचस्प होने लगती हैं। साइडकिक में एक कॉन्करेंसी विकल्प है जो नियंत्रित करता है कि यह कितने थ्रेड्स चलाता है। अधिकांश साइडकिक बनाम डिलेड जॉब बेंचमार्क साइडकिक के 25 थ्रेड्स तक के बहुत उच्च कॉन्करेंसी का उल्लेख करते हैं, जो इसके सुपर-फास्ट प्रदर्शन में योगदान देता है।
लेकिन वास्तविक सेटिंग में, आपको थ्रेड्स को कुछ अधिक रूढ़िवादी तक सीमित करना होगा। वास्तविक संख्या इस बात पर निर्भर करती है कि आपका एप्लिकेशन कितना भारी है और आप किस तरह के जॉब्स करते हैं। मैंने अभ्यास में देखा है कि यदि आप 512MB मेमोरी पर एक वर्कर चलाते हैं (Heroku पर standard-1x के बराबर), तो थ्रेड्स की संख्या 25 के बजाय 2 और 5 के बीच कहीं होती है।
माइक पेरहम द्वारा 'टेमिंग रेल्स मेमोरी ब्लोट', साइडकिक के निर्माता, मेमोरी मुद्दों पर अधिक विस्तार से चर्चा करते हैं और पढ़ने लायक है। मैं पूरी चर्चा में नहीं कूदूंगा, लेकिन वह सिफारिश करते हैं कि आप सभी वर्कर्स पर MALLOC_ARENA_MAX=2 सेट करें जो साइडकिक चलाते हैं।
रेगुलर malloc के बजाय jemalloc का उपयोग करना भी मदद करता है। ऐसा करने का सटीक तरीका आपके द्वारा उपयोग किए जाने वाले प्लेटफॉर्म पर निर्भर करता है, लेकिन यह Heroku पर काफी सरल है। बस heroku-buildpack-jemalloc को पहले बिल्डपैक के रूप में सेट करें (heroku/ruby बिल्डपैक से आगे)।
डिलेड जॉब सरल संसाधनों का उपयोग करता है
जैसा कि हमने चर्चा की, डिलेड जॉब आपके मौजूदा डेटाबेस इंस्टेंस पर चलता है। आपको बढ़ाने की आवश्यकता हो सकती है:
- उपलब्ध मेमोरी
- डिस्क स्थान
- अधिकतम कनेक्शन
जॉब लोड या आपके द्वारा चलाए जाने वाले वर्कर्स की संख्या के आधार पर। लेकिन आपको केवल जॉब प्रोसेसर की आवश्यकता है।
दूसरी ओर, साइडकिक को जॉब्स को संभालने के लिए एक रेडिस इंस्टेंस की आवश्यकता होती है। यदि आप रेडिस का उपयोग कैश स्टोर के रूप में भी करते हैं, तो यह अनुशंसा की जाती है कि आप साइडकिक जॉब्स के लिए "पर्सिस्टेंट स्टोर" के रूप में कॉन्फ़िगर किए गए एक अलग इंस्टेंस का उपयोग करें।
चूंकि रेडिस सबसे अच्छा काम करता है जब सब कुछ मेमोरी में फिट होता है, यदि आपके पास बहुत सारे जॉब्स हैं (उदाहरण के लिए, यदि ऐप में किसी समस्या के कारण साइडकिक उन्हें कुछ समय के लिए प्रोसेस करना बंद कर देता है), तो सब कुछ साफ़ करने में कुछ डाउनटाइम लग सकता है। यह विशेष रूप से परेशानी भरा है यदि आपके पास उसी सर्वर पर रेडिस है जिस पर आपका ऐप है। वे मेमोरी के लिए प्रतिस्पर्धा करना शुरू कर देंगे, जिससे स्वैपिंग होगी और अंततः आपके ऐप के प्रदर्शन को नष्ट कर देगी।
रेडिस के बारे में ध्यान देने योग्य एक महत्वपूर्ण बिंदु यह है कि इसे maxmemory-policy noeviction के साथ कॉन्फ़िगर किया जाना चाहिए ताकि साइडकिक के डेटा के साइलेंट ड्रॉप से बचा जा सके। अन्यथा, आप खुद को उन जॉब्स को मिस करते हुए पाएंगे जिन्हें परफॉर्म करने की आवश्यकता है, बिना किसी निशान के।
एक साइड-नोट: साइडकिक में पेड अपग्रेड
यदि आपको अतिरिक्त सुविधाओं की आवश्यकता है, तो साइडकिक Pro और Enterprise वर्जन के साथ आता है।
Pro में सबसे उल्लेखनीय जोड़ Batch Jobs है जो समानांतर में चल सकते हैं, निगरानी की जा सकती है, और एक समूह के रूप में इंटरैक्ट कर सकते हैं, जब सभी जॉब्स पूरे हो जाते हैं तो एक कॉलबैक इनवोक करते हैं। Pro में बेहतर विश्वसनीयता विशेषताएं भी हैं ताकि यह सुनिश्चित किया जा सके कि नेटवर्क समस्याओं के दौरान भी कोई जॉब साइलेंटली ड्रॉप न हो।
Enterprise वर्जन और भी अधिक सुविधाओं के साथ आता है। यदि आप किसी ऐसी चीज़ की तलाश में हैं जो एक नियमित साइडकिक इंस्टॉलेशन हल नहीं कर सकती, तो पेड साइडकिक सुविधाओं का पता लगाएं।
अभ्यास में, साइडकिक का मुफ्त वर्जन अभी भी बहुत अच्छा काम करता है। लेकिन यह जानना अच्छा है कि आवश्यकतानुसार अपग्रेड करने के लिए पेड विकल्प हैं, बजाय एक अलग समाधान पर स्विच करने के।
कम्युनिटी और डेवलपमेंट स्थिति: साइडकिक को बढ़त
दोनों साइडकिक और डिलेड जॉब के पीछे एक विशाल कम्युनिटी है। हालांकि, स्टैकओवरफ्लो या आधिकारिक डॉक्यूमेंटेशन में अपने सवालों के त्वरित उत्तर ढूंढना हमेशा आसान नहीं होता।
डेवलपमेंट पक्ष पर, चीजें डिलेड जॉब के लिए बहुत उज्ज्वल नहीं दिख रही हैं। दिसंबर 2021 और जनवरी 2022 में डिलेड जॉब पर कुछ मामूली काम किया गया था, लेकिन ऐसा नहीं लगता कि यह आगे कोई बड़ा विकास कर रहा है। यह मेंटेनेंस-ओनली मोड में प्रतीत होता है, और GitHub पर बहुत सारे खुले मुद्दे हैं।
इसके विपरीत, साइडकिक अभी भी सक्रिय विकास के तहत है, और इसका निर्माता इस पर फुल टाइम काम कर रहा है। बहुत कम खुले मुद्दे हैं, और उन्हें नियमित रूप से संबोधित किया जाता है।
समापन: साइडकिक या डिलेड जॉब? यह आपकी आवश्यकताओं पर निर्भर करता है
इस पोस्ट में, हमने रेल्स एप्लिकेशन के लिए दो प्रमुख जॉब प्रोसेसिंग सिस्टम - साइडकिक और डिलेड जॉब - को कवर किया, उनके कुछ फायदे और नुकसान को देखते हुए।
प्रत्येक के लिए अलग-अलग उपयोग के मामले हैं। यह सब आपके ऑपरेशन के बजट और पैमाने पर निर्भर करता है।
यदि प्रदर्शन और दीर्घकालिक रखरखाव महत्वपूर्ण हैं, तो साइडकिक एक नो-ब्रेनर है। दूसरी ओर, यदि रनिंग लागत एक चिंता है, तो डिलेड जॉब आपकी मदद कर सकता है।
चाहे आप डिलेड जॉब या साइडकिक चुनें, आपके प्रोजेक्ट के लिए शुभकामनाएं और हैप्पी कोडिंग!
👋 यदि आपने इस लेख को पसंद किया, तो हमारे रूबी परफॉरमेंस मॉनिटरिंग चेकलिस्ट में अन्य रूबी (ऑन रेल्स) परफॉरमेंस लेख देखें।
P.S. यदि आप रूबी मैजिक पोस्ट्स को प्रेस से निकलते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर को सब्सक्राइब करें और कभी भी एक भी पोस्ट मिस न करें!