2012-04-28 7 views
7

मैं एक ऐसे एप्लिकेशन का निर्माण कर रहा हूं जिसमें महत्वपूर्ण छवि प्रसंस्करण शामिल है। हम इसे एक वितरित मनोर में बना रहे हैं, जिसमें रैंडिटएमक्यू एक्सचेंज से छवियों को प्रस्तुत करने के लिए अनुरोध प्राप्त करने वाली मशीनों की एक मनमानी संख्या है।वैश्विक लॉकिंग प्राप्त करने के लिए एक mySQL कॉलम का एक साझे तरीका उपयोग कर रहा है?

क्योंकि एक प्रतिपादन पहले से ही प्रक्रिया में है, जबकि एक छवि के लिए अनुरोध हो सकता है, और क्योंकि मैं काम को डुप्लिकेट करने वाले दो रेंडर सर्वर नहीं चाहता हूं, मैंने mySQL छवियों तालिका में एक कॉलम बनाया है जिसे बुलीयन के रूप में is_rendering कहा जाता है ।

  1. अद्यतन के लिए छवि पंक्ति चुनें
  2. तो is_rendering == सच बीच में बंद करें प्रस्तुत करना अनुरोध
  3. :

    जब एक सर्वर प्रस्तुत करना एक अनुरोध के लिए प्रस्तुत करना यह है कि इस तरह दिखता है चरणों की एक श्रृंखला इस प्रकार प्राप्त करता है सेट is_rendering == सत्य है और लेनदेन

  4. छवि प्रस्तुत करें और थंबनेल को वैश्विक स्तर पर सुलभ स्टोर में संग्रहीत करें
  5. सेट is_rendering == झूठी और वापसी

यह निश्चित रूप से काम करता है, लेकिन मुझे चिंता है कि ये अक्सर डेटाबेस अपडेट थोड़ा मूर्ख लगते हैं। इसके अलावा मैं किनारे के मामले पर विचार कर रहा हूं जहां एक रेंडर सर्वर एक प्रतिपादन के बीच में विफल रहता है और पत्तियों is_rendering == सत्य है, उस छवि को कभी भी प्रस्तुत किए जाने से रोकता है। समाधान मैं इस समस्या पर विचार कर रहा हूं is_rendering कॉलम को tinyint (1) से डेटाटाइम फ़ील्ड में बदलना है, और लॉकिंग की तारीख को "सत्य" मान के रूप में संग्रहीत करना और "झूठा" मान के रूप में शून्य करना है। एक आवधिक सेवा स्वास्थ्य जांच एक निश्चित समय अवधि के साथ is_rendering मूल्य के साथ सभी पंक्तियों का चयन कर सकती है और इस मामले में लॉक जारी कर सकती है।

क्या यह इस समस्या का एक सापेक्ष दृष्टिकोण है, या क्या अन्य और सुरुचिपूर्ण दृष्टिकोण हैं जिन पर मुझे विचार करना चाहिए?

+0

मैंने डेटाटाइम फील्ड लॉक दृष्टिकोण को कई बार सफलतापूर्वक कार्यान्वित किया है – ilanco

+0

मुझे ऐसे कॉलम को पेश करने के अलावा लॉकिंग का कोई अन्य तरीका नहीं दिख रहा है। केवल मैं इसे एक स्थिति बनाउंगा, जैसे '0 = not_rendered, 1 = प्रतिपादन, 2 = rendered'। लेकिन शायद मैंने आपके वर्कफ़्लो को थोड़ा सा समझा। और निश्चित रूप से, 'इनो डीबी' लेनदेन का उपयोग करके यह सुनिश्चित होगा कि केवल एक समवर्ती क्वेरी राज्य को प्रस्तुत करने के लिए एक छवि सेट कर सके। –

+0

क्या दृष्टिकोण स्वयं समझदार है, मुझे नहीं पता लेकिन कॉलम के विकल्प के रूप में एक अलग 1: 1 'is_rendering (int) 'तालिका मेरे लिए अधिक प्रबंधनीय प्रतीत होती है। बस रिकॉर्ड्स जोड़ें/हटाएं और आपको स्वास्थ्य जांच में सभी छवि रिकॉर्ड्स स्कैन करने की आवश्यकता नहीं होगी। यदि आपको एक ही समय में छवि की आवश्यकता है, हालांकि, यह अतिरिक्त काम हो सकता है। – mkjeldsen

उत्तर

0

को पूरा नहीं कर रहे हैं तो मैं आगे बढ़ गया हूं और कार्यान्वयन को DATETIME कॉलम का उपयोग करने के लिए बदल दिया है।

मैं वास्तव में यहां उत्सुक था अगर यह सामान्य रूप से mySQL का खराब उपयोग था। मैंने जो शोध किया है, उससे मैं हडोप के चिड़ियाघर की तरह कुछ जा सकता हूं: http://zookeeper.apache.org/doc/r3.1.2/recipes.html या Google की आंतरिक गोल-मटोल प्रणाली जैसी कुछ। चूंकि यह सेवा का पहला पुनरावृत्ति है, इसलिए मैं अपने एसक्यूएल के साथ चिपकने जा रहा हूं।

जो मैंने यहां पढ़ा है, और जो मैंने वैश्विक लॉक बनाने के तरीके के रूप में mySQL का उपयोग करके ऑनलाइन पढ़ा है, वह एक भयानक विचार नहीं है, और इसे थोड़ा DATETIME कॉलम में बदल रहा है, जबकि थोड़ा उलझन है, एक नौकरी प्रसंस्करण के बीच में बंद मशीन के अजीब किनारे के मामले को संभालने के लिए एक समाप्ति नीति को लागू करने का सबसे अच्छा तरीका है।

एक लेनदेन-स्तर लॉक पर होल्डिंग एक और दृष्टिकोण होगा, लेकिन यह समझ में नहीं आता है कि एक सर्वर एक छोटे कनेक्शन पूल के साथ कई धागे चला रहा है, यह कनेक्शन को अनावश्यक रूप से जोड़ देगा, हालांकि यह एक निर्मित है ग्राहक कनेक्शन खो जाने पर समाप्ति में।

0

प्रिय जैसा कि मैं आपकी समस्या को समझता हूं, यदि आप निम्न नियमों का पालन कर रहे हैं तो आपका पहला दृष्टिकोण भी सही है: 1) आपकी तालिका का प्रकार innoDB है। 2) आप अपने कोड में लेनदेन का उपयोग कर रहे हैं। क्योंकि अगर कोई ब्रेकअप अपडेट के दौरान खुश होता है तो यह रोलबैक होगा।

अंत में, आपका दूसरा दृष्टिकोण भी बेहतर है। यदि आप मेरे उल्लिखित अंक

+0

मैं इनो डीबी का उपयोग कर रहा हूं। मुझे नहीं लगता कि पूरे प्रतिपादन के लिए लेनदेन को पकड़ना बुद्धिमानी है। प्रस्तुत करने में 30+ सेकंड लग सकते हैं और मैं कनेक्शन पूलिंग का उपयोग कर रहा हूं। लेनदेन पर होल्डिंग का मतलब है कि मुझे एक कनेक्शन बांधना है जिसे कहीं और इस्तेमाल करने के लिए रखा जा सकता है। – Andrew

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