मैं
रेसक्यू का बहुत बड़ा प्रशंसक
हूं , जो
रेडिस को एक रिपॉजिटरी के रूप में उपयोग करता है, हालांकि, अगर बड़ी संख्या में पृष्ठभूमि कार्यों को जल्दी से करने की आवश्यकता होती है, तो कुछ मामलों में
विलंबित_जॉब अधिक कुशलता से काम कर सकता है, क्योंकि यह हर बार एक नया कार्य नहीं करता है।
कांटे पर लिखने के सभी आकर्षण के बावजूद
लिनक्स पर
कांटा () एक काफी धीमा ऑपरेशन है। बड़ी संख्या में सजातीय कार्यों के मामले में, प्रत्येक कार्य के लिए एक नई प्रक्रिया को शुरू करने का कोई मतलब नहीं है। इसलिए, हमने
विलंबित_जॉब का उपयोग करने का निर्णय लिया, जो एक चक्र में सभी कार्यों को क्रमिक रूप से एक के बाद एक करता है।
लाभ स्पष्ट है, मैं यहां कुछ सुझाव प्रस्तुत करने का प्रयास करूंगा कि कैसे नुकसान को खत्म किया जाए, जिससे कार्यान्वयन में तेजी आए। मुझे लगता है कि ये काफी प्रसिद्ध तथ्य हैं, लेकिन शुरुआती लोगों के लिए यह उपयोगी होना चाहिए।
एक लेनदेन में बहुत सारे INSERT लपेटें
हर बार एक नया कार्य जोड़े जाने पर
विलंबित_पोषक तालिका में
विलंबित_जॉब सम्मिलित होता है।
ActiveRecord में, डिफ़ॉल्ट रूप से कॉल को एक लेनदेन में लपेटा जाता है। इसलिए, पृष्ठभूमि कार्यों के बड़े पैमाने पर निर्माण के दौरान बड़ी संख्या में लेनदेन नहीं करने के लिए, एक या एक से अधिक लेनदेन में सब कुछ लपेटने की सिफारिश की जाती है:
job_items.in_groups_of(500, false) do |group| ActiveRecord::Base.transaction do group.each do |job_item_id| JobRunner.delay.execute_job(job_item_id) end end end
अधिक जानकारी यहाँ:
www.coffeepowered.net/2009/01/23/mass-inserting-data-in-rails-without-killing-your-performanceसीरियलाइजेशन / डीरिआयलाइजेशन ओवरहेड से बचें
विलंबित_जब डेटा को
अनुक्रमित करता है जब यह एक कार्य बनाता है और निष्पादन से ठीक पहले deserializes। पृष्ठभूमि कार्यों के लिए मापदंडों के रूप में
, भारी
ActiveRordord ऑब्जेक्ट्स के बजाय क्लास
फिक्सनम ,
स्ट्रिंग या
हैश की वस्तुओं को पास करना हमेशा बेहतर होता है।
JobRunner.delay.send_activation_instructions(user.id)
इससे बहुत बेहतर:
JobRunner.delay.send_activation_instructions(user)
विलंबित_जॉब कार्यकर्ताओं को कोर की संख्या से चलाएं
रूबी में बहुआयामी वांछित होने के लिए बहुत कुछ छोड़ देता है, इसलिए आमतौर पर सब कुछ कई प्रक्रियाओं को बनाकर समानांतर किया जाता है।
कोई अपवाद नहीं और
विलंबित_जॉब । उदाहरण के लिए, यदि आपका
शीर्ष / htop 4 धागे दिखाता है, तो सबसे अच्छा प्रदर्शन प्राप्त करने के लिए आपको 4 श्रमिकों को चलाने की आवश्यकता है:
script/delayed_job -i 0 start script/delayed_job -i 1 start script/delayed_job -i 2 start script/delayed_job -i 3 start
कभी-कभी आप अधिक कर सकते हैं, लेकिन यहां आपको प्रोसेसर के उपयोग की निगरानी करने और विशिष्ट कार्यों की बारीकियों को ध्यान में रखने की आवश्यकता है।
वैसे,
विलंबित_जॉब में
मॉनेट के साथ कई श्रमिकों की निगरानी के लिए एक कॉन्फ़िगरेशन है (देखें contrib / delayed_job_multiple.monitrc फ़ाइल)।
इसके साथ ही
इसके अलावा, यह निम्नलिखित परिवर्धन पर ध्यान देने योग्य है:
यह ध्यान देने योग्य है कि विलंबित_जॉब_रेडिस हम रेल 3.2 के साथ शुरू करने में सक्षम नहीं थे।