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