10

अरे। मैं पृष्ठभूमि प्रसंस्करण के लिए देरी_job का उपयोग करें। मैं 8 CPU सर्वर, MySQL है और मैं शुरू 7 delayed_job प्रक्रियाओंरेल कई देरी_job चल रहे हैं - लॉक टेबल

RAILS_ENV=production script/delayed_job -n 7 start 

Q1: मैं सोच रहा हूँ यह संभव है कि 2 या अधिक delayed_job प्रक्रियाओं एक ही प्रक्रिया का संसाधन शुरू (एक ही में रिकॉर्ड पंक्ति डेटाबेस देरी_jobs)। मैंने देरी_बॉज प्लगइन के कोड की जांच की लेकिन लॉक निर्देश को इस तरह से नहीं मिला (यह लॉक टेबल या चयन ... अपडेट के लिए नहीं)।

मुझे लगता है कि प्रत्येक प्रक्रिया को lock_by कॉलम पर अद्यतन को निष्पादित करने से पहले डेटाबेस तालिका को लॉक करना चाहिए। वे लॉक_बी फ़ील्ड को अपडेट करके रिकॉर्ड को लॉक करते हैं (अद्यतन देरी_jobs एसईटी लॉक_बी ...)। क्या वह वास्तव में पर्याप्त है? कोई लॉकिंग की आवश्यकता नहीं है? क्यूं कर? मुझे पता है कि अद्यतन की तुलना में अद्यतन की उच्च प्राथमिकता है लेकिन मुझे लगता है कि इस मामले में इसका प्रभाव नहीं है।

multy-थ्रेडेड स्थिति की मेरी समझ है:

Process1: Get waiting job X. [OK] 
Process2: Get waiting jobs X. [OK] 
Process1: Update locked_by field. [OK] 
Process2: Update locked_by field. [OK] 
Process1: Get waiting job X. [Already processed] 
Process2: Get waiting jobs X. [Already processed] 

मैं कुछ मामलों में लगता है और नौकरियों का एक ही जानकारी प्राप्त कर सकते हैं और एक ही प्रक्रिया का संसाधन शुरू हो सकता है।

प्रश्न 2: 7 देरी_बॉज 8CPU सर्वर के लिए एक अच्छी संख्या है? हाँ क्यों नहीं

Thx 10x!

उत्तर

11

मुझे लगता है कि आपके सवाल का जवाब 'lib/delayed_job/job.rb' की लाइन 168 में है:

self.class.update_all(["locked_at = ?, locked_by = ?", now, worker], ["id = ? and (locked_at is null or locked_at < ?)", id, (now - max_run_time.to_i)]) 

यहाँ पंक्ति के अद्यतन केवल किया जाता है, कोई अन्य कर्मी ने पहले ही बंद कर दिया गया है, तो नौकरी और यह जांच की जाती है कि तालिका अद्यतन है या नहीं। एक टेबल लॉक या इसी तरह (जिस तरह से आपके ऐप के प्रदर्शन को बड़े पैमाने पर कम किया जाएगा) की आवश्यकता नहीं है, क्योंकि आपका डीबीएमएस यह सुनिश्चित करता है कि एक ही क्वेरी का निष्पादन अन्य प्रश्नों के प्रभाव से अलग हो। आपके उदाहरण में Process2 को जॉब एक्स के लिए लॉक नहीं मिल सकता है, क्योंकि यह जॉब्स टेबल अपडेट करता है अगर केवल और अगर इसे पहले लॉक नहीं किया गया था।

आपके दूसरे प्रश्न पर: यह निर्भर करता है। एक 8 सीपीयू सर्वर पर। जो इस नौकरी के लिए समर्पित है, 8 कर्मचारी एक अच्छा प्रारंभिक बिंदु हैं, क्योंकि श्रमिक एकल धागे हैं, आपको प्रत्येक कोर के लिए एक को चलाने चाहिए। आपके सेटअप के आधार पर कम या ज्यादा कर्मचारी बेहतर होते हैं। यह आपकी नौकरियों पर भारी निर्भर करता है। मल्टीपल कोर के अपने नौकरियों का लाभ उठाएं? या क्या आपका काम बाहरी संसाधनों के लिए अधिकांश समय प्रतीक्षा करता है? आपके पास विभिन्न सेटिंग्स के साथ प्रयोग है और सभी शामिल संसाधनों पर एक नज़र डालें।

+0

तो आप कह रहे हैं कि प्रत्येक प्रोसेस परमाणु शैली की प्रक्रिया है और सुरक्षित है? – xpepermint

+0

मुझे लगता है कि यहां क्या गुम है, अद्यतन है ... अद्यतन के लिए। ? – xpepermint

+0

क्वेरी परमाणु है। इसलिए यदि आप 'UPDATE जॉब्स SET locked_at =' .. 'को लॉक करते हैं, तो locked_by = 1 जहां id = 12 और (locked_at शून्य या locked_at <' .. ') है, फिर लॉक_ट और लॉक_बी केवल तभी अपडेट किया जाता है जब कोई नहीं है अन्य मान्य ताला डीबीएमएस पहले जांच करता है कि उस स्थिति को फिर से निष्पादित करता है और यह सुनिश्चित करता है कि पंक्ति के बीच में कोई बदलाव नहीं बदला गया है। इसलिए आप एक मौजूदा लॉक को ओवरराइट नहीं कर सकते हैं। – gregor

संबंधित मुद्दे