क्यों डेटाबेस कतार के रूप में इतना बुरा है? [बन्द है]


33

मैंने अभी यह लेख पढ़ा है , और मैं उलझन में हूँ।

चलो एक ही डेटाबेस को साझा करते हुए , "कार्यकर्ता" के रूप में 1 वेबएप और 1 अलग-अलग एप्लिकेशन की कल्पना करते हैं

ओह, मैंने कहा "साझा करना" .. लेकिन लेख किस बारे में चेतावनी देता है? :

चौथा, अनुप्रयोगों (या सेवाओं) के बीच एक डेटाबेस साझा करना एक बुरी बात है। यह सिर्फ वहाँ साझा करने के लिए अनाकार साझा राज्य को लुभाने के लिए है और इससे पहले कि आप जानते हैं कि आपके पास एक बहुत ही शानदार राक्षस होगा।

=> असहमत। कुछ मामले हैं जहां अलग-अलग अनुप्रयोग अभी भी एक ही इकाई का हिस्सा हैं, और इसलिए, "युग्मन मुद्दा" की धारणा इस मामले में कोई मतलब नहीं है।

चलो जारी रखें: वेब डोमेन क्लाइंट HTTP अनुरोधों को संभालता है और किसी भी समय कुछ एग्रीगेट (डीडीडी अवधि) को अपडेट कर सकता है, जो संबंधित डोमेन घटनाओं को उत्पन्न करता है।
कार्यकर्ता का लक्ष्य आवश्यक कार्य को संसाधित करके उन डोमेन घटनाओं को संभालना होगा।

मुद्दा ये है:

ईवेंट डेटा को कार्यकर्ता को कैसे पास किया जाना चाहिए?

पहला उपाय, जैसा कि पढ़ा गया लेख बढ़ावा देता है, एक महान संदेश-उन्मुख मिडलवेयर होने के नाते, RabbitMQ का उपयोग करना होगा।

वर्कफ़्लो सरल होगा:

किसी भी समय वेब dyno एक घटना उत्पन्न करता है, यह इसे RabbitMQ के माध्यम से प्रकाशित करता है, जो कार्यकर्ता को खिलाता है।
दोष यह होगा कि कुछ भी संभावित भेजने विफलताओं से निपटने के बिना, कुल अद्यतन और घटना के प्रकाशन के बीच तत्काल स्थिरता की गारंटी नहीं देता है ... या हार्डवेयर मुद्दे; यह एक और मुख्य मुद्दा है।

उदाहरण: यह संभव होगा कि कोई ईवेंट समग्र अद्यतन की सफलता के बिना प्रकाशित किया गया था ... जिसके परिणामस्वरूप एक ईवेंट डोमेन मॉडल के गलत प्रतिनिधित्व का प्रतिनिधित्व करता है।
आप तर्क दे सकते हैं कि वैश्विक XA (दो-चरण प्रतिबद्ध) मौजूद है, लेकिन यह एक समाधान नहीं है जो सभी डेटाबेस या मिडलवेर्स को फिट करता है।

तो इस तात्कालिक स्थिरता को सुनिश्चित करने के लिए एक अच्छा समाधान क्या हो सकता है? :
IMO, डेटाबेस में ईवेंट को संग्रहीत करते हुए, कुल अद्यतन के समान स्थानीय लेनदेन में।
एक साधारण एसिंक्रोनस शेड्यूलर बनाया जाएगा और डेटाबेस से वर्तमान अप्रकाशित घटनाओं को क्वेरी करने के लिए जिम्मेदार होगा और उन्हें RabbitMQ पर भेज देगा, जो बदले में कार्यकर्ता को आबाद करता है।

लेकिन वेब साइड में और रास्ते में एक अतिरिक्त अनुसूचक की आवश्यकता क्यों है: इस मामले में RabbitMQ की आवश्यकता क्यों है?

इस समाधान के द्वारा, यह तार्किक रूप से प्रकट होता है, कि RabbitMQ अनावश्यक हो सकता है, खासकर क्योंकि डेटाबेस साझा किया गया है।
दरअसल, जो भी हो, हमने देखा कि तात्कालिक संगतता में डेटाबेस से एक मतदान शामिल है।
इस प्रकार, कार्यकर्ता इस मतदान के लिए सीधे जिम्मेदार क्यों नहीं होंगे?

इसलिए, मुझे आश्चर्य है कि संदेश-उन्मुख मिडलवेयर को बढ़ावा देते हुए वेब पर इतने सारे लेख शायद ही कतई डेटाबेस की आलोचना करते हैं।

लेख का अंश:

सरल, नौकरी के लिए सही उपकरण का उपयोग करें: यह परिदृश्य एक संदेश प्रणाली के लिए रो रहा है। यह ऊपर वर्णित सभी समस्याओं को हल करता है; कोई अधिक मतदान, कुशल संदेश वितरण, कतारों से पूर्ण संदेश को साफ करने की आवश्यकता नहीं, और कोई साझा स्थिति नहीं।

और तत्काल संगति, अनदेखा?

संक्षेप में, यह वास्तव में लगता है कि जो भी मामला है, जिसका अर्थ डेटाबेस साझा है या नहीं, हमें डेटाबेस मतदान की आवश्यकता है

क्या मुझे कुछ आलोचनात्मक धारणाएँ याद थीं?

धन्यवाद


2
मतदान एक लाल हेरिंग की तरह है, क्योंकि लगभग सभी प्रमुख डेटाबेसों में अतुल्यकालिक रूप से कुछ अन्य प्रक्रिया को सूचित करने के लिए कुछ तंत्र है जो किसी तालिका से कुछ काम खींचने का समय है।
ब्लरफ्ल

जवाबों:


28

यदि आप कम ट्रैफ़िक के साथ एक साधारण एप्लिकेशन बना रहे हैं, तो आपके सिस्टम से एक और घटक रखने के बारे में कुछ कहा जाना है। यह बहुत संभावना है कि संदेश बस का उपयोग नहीं करना आपके लिए सही उत्तर है। हालाँकि, मैं सुझाव दूंगा कि आप अपने सिस्टम का निर्माण इस तरह से कर सकते हैं जैसे कि मिडलवेयर सॉल्यूशन के लिए डेटाबेस-आधारित कतार सिस्टम को स्वैप कर सकते हैं। मैं लेख से सहमत हूं। एक डेटाबेस कतार आधारित प्रणाली के लिए सही उपकरण नहीं है, लेकिन यह आपके लिए काफी अच्छा हो सकता है।

RabbitMq जैसी कतार आधारित प्रणाली को उदारवादी हार्डवेयर पर बड़े पैमाने पर बनाया गया है। उनकी वास्तुकला ऐसी प्रक्रियाओं से बचकर प्राप्त करने में सक्षम है जो ACID अनुरूप डेटाबेस सिस्टम को उनके स्वभाव से धीमा बनाते हैं। चूंकि एक संदेश बस को यह सुनिश्चित करने की आवश्यकता है कि एक संदेश संग्रहीत और सफलतापूर्वक संसाधित किया गया है, इसलिए इसे लेनदेन लॉग को लॉक करने और लिखने से परेशान होने की आवश्यकता नहीं है। ये दोनों अवधारणाएं ACID प्रणाली के लिए बिल्कुल आवश्यक हैं, लेकिन अक्सर विवाद का कारण बनती हैं।

प्रदर्शन-वार यह नीचे आता है: आपके पास एक SQL तालिका है। खूब पढ़ता है और खूब लिखता है। दोनों को पंक्तियों, पृष्ठों और अनुक्रमित को अद्यतन करने के लिए किसी प्रकार के लॉकिंग की आवश्यकता होती है। आपका मतदान तंत्र लगातार उस पर लुकअप करने के लिए एक सूचकांक को लॉक कर रहा है। यह लिखने से रोकता है; सबसे अच्छी बात है कि वे कतारबद्ध हैं। प्रोसेसिंग करते हुए कोड भी कतार पर स्थिति को अपडेट करने के लिए लॉक कर रहा है क्योंकि वे पूर्ण या विफल होते हैं। हां, आप यह काम करने के लिए अनुकूलन के बाद क्वेरी ऑप्टिमाइज़ेशन कर सकते हैं, या आप विशेष रूप से डिज़ाइन किए गए कार्य लोड के लिए एक सिस्टम का उपयोग कर सकते हैं जो आप पूछ रहे हैं। एक RabbitMq इस तरह के वर्कलोड को खा जाता है, यहां तक ​​कि एक पसीने को तोड़ने के बिना भी; उसके शीर्ष पर, आपको अपने डेटाबेस को कार्यभार से बचाने के लिए मिलता है, जिससे उसे अन्य चीजों को करने के लिए अधिक जगह मिलती है।

एक और बात पर विचार करने के लिए सबसे अधिक कतार सिस्टम आमतौर पर एक मतदान तकनीक का उपयोग नहीं करते हैं (कुछ HTTP के लिए अनुमति देते हैं, लेकिन प्राप्त पक्ष के लिए उपयोग करने से बचने की सलाह देते हैं)। RabbitMq विशेष रूप से AMPQ जैसे संदेश बसों के लिए डिज़ाइन किए गए नेटवर्क प्रोटोकॉल का उपयोग करता है ।

संपादित करें: उपयोग के मामले को जोड़ना।

जिस तरह से मैंने रैबिट का उपयोग किया है वह है मेरे पास एक एपीआई एंडपॉइंट है जो एक बदलाव को स्वीकार करता है जिसके लिए एक भारी उपयोग की गई डेटाबेस तालिका की आवश्यकता होती है। यह तालिका निरंतर विवाद के अधीन है और कई बार एपीआई से समय पर फैशन में बदलाव को बचाने में सक्षम नहीं होगी। इसके बजाय मैं एक कतार में परिवर्तन के अनुरोध को लिखता हूं और फिर एक सेवा है जो इन संदेशों को सक्षम बनाता है जैसे वे सक्षम हैं। यदि डेटाबेस विवाद होता है, तो कतार बस बढ़ती है और संदेश प्रसंस्करण में देरी होती है। आमतौर पर प्रसंस्करण समय नीचे 14ms रेंज में है, लेकिन उच्च विवाद के समय में हम 2-3 सेकंड तक प्राप्त करते हैं।


आप इस मामले में तत्काल संजीदगी से कैसे निपट सकते हैं? यदि प्रकाशन किया जाता है, लेकिन ठीक बाद में, डोमेन मॉडल रोलबैक को अपडेट करने के लिए जिम्मेदार लेनदेन ... मिडलवेयर पूरी तरह से अनजान होगा और इस घटना को संसाधित करेगा।
मिक

आपने लिखा है: "इसे लॉक करने से परेशान होने की आवश्यकता नहीं है"। लेकिन निश्चित रूप से मार्गबद्ध घटनाओं (कार्यकर्ता की ओर) के आरोही क्रम (समय में) को सुनिश्चित करने के लिए एक तरह का ताला है, नहीं?
मिक

@ Mik378 इस लेख पर एक नजर डालिए संदेश की बेमिसालता पर । हां, तकनीकी रूप से आप निरंतरता के कुछ वादे को खो देते हैं, लेकिन मुझे यकीन है कि आपको एप्लिकेशन अपटाइम की विश्वसनीयता के मामले में जो भी हासिल होगा, वह मिल जाएगा और प्रदर्शन इसके लिए अच्छा है। नुकसान को बहुत दर्द रहित बनाने के लिए संदेशों को संसाधित करने के तरीके को बदलना भी काफी आसान है।
ब्रायनफ्यूच

2
हाँ, आपको आदेश की गारंटी के लिए लॉकिंग की आवश्यकता होगी। कुछ कतार प्रणाली प्रदर्शन की कीमत पर इसे प्रदान कर सकती हैं। यदि आप इस तथ्य को स्वीकार कर सकते हैं कि कभी-कभी संचालन क्रम से बाहर हो जाएगा और प्रोसेसर पक्ष पर इसे संभालने का एक तरीका पता लगाएगा, तो आप एक प्रदर्शन स्टैंड बिंदु से तेजी से लाभ प्राप्त करेंगे।
ब्रायनफ्यूच

1
@ मिक 378 - मैंने अपने उत्तर में एक उपयोग का मामला जोड़ा। मुझे उम्मीद है यह मदद करेगा!
ब्रायनफ्यूच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.