चेतावनी: बड़ी पोस्ट, कुछ राय, अस्पष्ट 'क्या आपके लिए सबसे अच्छा काम करता है' निष्कर्ष
आमतौर पर, यह आपके डेटाबेस के आसपास 'हेक्सागोनल आर्किटेक्चर' को लागू करने के साधन के रूप में किया जाता है। आपके पास एक समान तरीके से अपने डेटाबेस का उपभोग करने वाले वेब एप्लिकेशन, मोबाइल एप्लिकेशन, डेस्कटॉप एप्लिकेशन, बल्क इंपोर्टर्स और बैकग्राउंड प्रोसेसिंग हो सकते हैं। निश्चित रूप से आप अपने डेटाबेस तक पहुँचने के लिए एक समृद्ध पुस्तकालय लिखकर, और अपनी सभी प्रक्रियाओं को उस पुस्तकालय का उपयोग करके एक ही चीज़ को कुछ हद तक पूरा कर सकते हैं। और वास्तव में, यदि आप एक छोटी सी दुकान में एक बहुत ही सरल प्रणाली के साथ हैं, तो यह वास्तव में एक बेहतर मार्ग है; यह एक सरल दृष्टिकोण है और अगर आपको अधिक जटिल प्रणाली की उन्नत क्षमताओं की आवश्यकता नहीं है, तो जटिलता के लिए भुगतान क्यों करें? हालाँकि, अगर आप सिस्टम के एक बड़े, परिष्कृत सेट के साथ काम कर रहे हैं, जो सभी को अपने डेटाबेस के साथ बड़े पैमाने पर बातचीत करने की आवश्यकता है, '
प्लेटफ़ॉर्म स्वतंत्रता और रखरखाव
यदि आपके पास एक डेटाबेस है, और आप उस डेटाबेस के साथ बातचीत करने के लिए एक पायथन लाइब्रेरी लिखते हैं, और हर कोई उस लाइब्रेरी में डेटाबेस के साथ बातचीत करने के लिए खींचता है, तो यह बहुत अच्छा है। लेकिन मान लीजिए कि आपको अचानक एक मोबाइल ऐप लिखने की आवश्यकता है, और उस मोबाइल ऐप को अब डेटाबेस से भी बात करनी होगी। और आपके iOS इंजीनियर पायथन का उपयोग नहीं करते हैं, और आपके एंड्रॉइड इंजीनियर पायथन का उपयोग नहीं करते हैं। हो सकता है कि iOS लोग Apple की भाषाओं का उपयोग करना चाहते हैं और Android इंजीनियर जावा का उपयोग करना चाहते हैं। फिर आप 3 अलग-अलग भाषाओं में अपने डेटा एक्सेस लाइब्रेरी को लिखना और उसे बनाए रखना चाहते हैं। हो सकता है कि आईओएस और एंड्रॉइड देवता एक्समरीन की तरह कुछ का उपयोग करने का निर्णय लेते हैं ताकि वे उस कोड को अधिकतम कर सकें जो वे साझा कर सकते हैं। बिल्कुल सही, सिवाय इसके कि आप अभी भी अपने डेटा एक्सेस लाइब्रेरी को .NET में पोर्ट करने जा रहे हैं। और फिर आपकी कंपनी ने सिर्फ दूसरी कंपनी खरीदी जो ' s वेब एप्लिकेशन एक असमान लेकिन संबंधित उत्पाद है, और व्यवसाय आपकी कंपनी के प्लेटफ़ॉर्म से कुछ डेटा को नए अधिग्रहित सहायक के प्लेटफ़ॉर्म में एकीकृत करना चाहता है। केवल एक ही समस्या है: सहायक एक स्टार्ट-अप था और डार्ट में उनके आवेदन के थोक को लिखने का फैसला किया। इसके अलावा, जो भी कारण (आपके नियंत्रण से परे के कारण हैं) जो मोबाइल टीम थी जो ज़मरीन को पायलट कर रही थी, उन्होंने फैसला किया कि यह उनके लिए नहीं है, और वे मोबाइल उपकरणों के लिए विशेष उपकरण और भाषाओं का उपयोग करेंगे, जिनके लिए वे विकसित हो रहे हैं। लेकिन जब आप उस चरण में थे, तब आपकी टीम ने आपके डेटा एक्सेस लाइब्रेरी के एक बड़े हिस्से को .NET में पहले ही डिलीवर कर दिया था, और कंपनी की एक अन्य टीम कुछ पागल सेल्सफोर्स इंटीग्रेशन सामान लिख रही थी और .NET के सभी काम करने का फैसला किया। के लिए पहले से ही एक डेटा एक्सेस लाइब्रेरी थी।
तो अब, घटनाओं के एक बहुत ही यथार्थवादी मोड़ के कारण, आपके पास पायथन, .NET, स्विफ्ट, जावा और डार्ट में लिखी गई आपकी डेटा एक्सेस लाइब्रेरी है। वे उतने अच्छे नहीं हैं जितना आप उन्हें पसंद करेंगे। आप ओआरएम का उतना प्रभावी ढंग से उपयोग नहीं कर सकते, जितना आप करना चाहते हैं, क्योंकि प्रत्येक भाषा में अलग-अलग ओआरएम उपकरण होते हैं, इसलिए आपको अपनी पसंद से अधिक कोड लिखना होगा। और आप प्रत्येक अवतार में उतना समय नहीं दे पाए हैं जितना आप चाहते थे, क्योंकि उनमें से 5 हैं। और लाइब्रेरी का डार्ट संस्करण विशेष रूप से बालों वाला है क्योंकि आपको इसमें से कुछ के लिए अपने-अपने लेन-देन के सामान को रोल करना पड़ा था क्योंकि पुस्तकालय और समर्थन बस वास्तव में नहीं था। आपने यह मामला बनाने की कोशिश की कि इस वजह से, डार्ट एप्लिकेशन में केवल आपके डेटाबेस के लिए रीड-ओनली कार्यक्षमता होनी चाहिए, लेकिन व्यवसाय ने पहले ही अपना मन बना लिया था कि वे जो भी सुविधाएँ योजना बना रहे थे वे अतिरिक्त प्रयास के लायक थे। और यह पता चलता है कि कुछ सत्यापन तर्क में एक बग है जो आपके डेटा एक्सेस लाइब्रेरी के इन सभी अवतारों में मौजूद है। अब आपको इन सभी पुस्तकालयों में इस बग को ठीक करने के लिए परीक्षण और कोड लिखना है, इन सभी पुस्तकालयों में अपने परिवर्तनों के लिए कोड समीक्षा प्राप्त करें, इन सभी पुस्तकालयों पर क्यूए प्राप्त करें, और सभी के सभी सिस्टम का उपयोग करके अपने परिवर्तनों को जारी करें। इन पुस्तकालयों। इस बीच, आपके ग्राहक नाराज हैं और ट्विटर पर ले गए हैं, उन अश्लीलताओं के संयोजन के बारे में जिनके बारे में आपने कभी कल्पना भी नहीं की होगी, कल्पना की जा सकती है, अकेले अपनी कंपनी के प्रमुख उत्पाद पर लक्षित करें। और उत्पाद के मालिक पूरी तरह से स्थिति के बारे में समझ नहीं होने का फैसला करते हैं।
कृपया समझें कि कुछ वातावरणों में, उपरोक्त उदाहरण कुछ भी है, लेकिन विपरीत है। यह भी ध्यान रखें कि घटनाओं का यह क्रम कुछ वर्षों के दौरान सामने आ सकता है। आमतौर पर, जब आप उस बिंदु पर पहुंच जाते हैं, जहां आर्किटेक्ट और व्यवसायी लोग आपके डेटाबेस के लिए अन्य सिस्टम को हुक करने की बात करना शुरू करते हैं, तो यह तब होता है जब आप अपने रोडमैप पर 'डेटाबेस के सामने एक REST API' प्राप्त करना चाहते हैं। इस पर विचार करें कि कब शुरू हुआ, जब यह स्पष्ट था कि यह डेटाबेस कुछ प्रणालियों द्वारा साझा किया जाना शुरू होने वाला था, कि एक वेब सेवा / REST API को इसके सामने रखा गया था। अपने सत्यापन बग को ठीक करना बहुत तेज और आसान होगा क्योंकि आप इसे 5 बार के बजाय एक बार कर रहे हैं। और फिक्स को जारी करना समन्वय करना बहुत आसान होगा, क्योंकि आप '
TLDR; डेटा एक्सेस लॉजिक को केंद्रीकृत करना और बहुत पतले HTTP क्लाइंट्स को बनाए रखना आसान है, क्योंकि डेटा एक्सेस लॉजिक को प्रत्येक एप्लिकेशन को वितरित करना है, जिसे डेटा एक्सेस करने की आवश्यकता है। वास्तव में, आपका HTTP क्लाइंट मेटा-डेटा से भी उत्पन्न हो सकता है। बड़े सिस्टम में, REST API आपको कम कोड बनाए रखने देता है
प्रदर्शन और मापनीयता
कुछ लोग यह मान सकते हैं कि पहले वेब सेवा के माध्यम से जाने के बजाय सीधे डेटाबेस से बात करना अधिक तेज़ है। यदि आपके पास केवल एक आवेदन है, तो यह निश्चित रूप से सच है। लेकिन बड़ी प्रणालियों में, मैं भावना से असहमत हूं। आखिरकार, कुछ स्तर पर, डेटाबेस के सामने कुछ प्रकार के कैश डालने के लिए यह बहुत फायदेमंद होने वाला है। शायद आप हाइबरनेट का उपयोग कर रहे हैं, और L2 कैश के रूप में एक Infinispan ग्रिड स्थापित करना चाहते हैं। यदि आपको अपने अनुप्रयोगों से अलग अपनी वेब सेवा को होस्ट करने के लिए 4 गोमांस सर्वरों का एक समूह मिला है, तो आप एक अंतर्निहित टोपोलॉजी के साथ तुल्यकालिक प्रतिकृति को चालू कर सकते हैं। यदि आप इसे 30 एप्लिकेशन सर्वरों के क्लस्टर पर रखने का प्रयास करते हैं, तो उस सेटअप में प्रतिकृति चालू करने का ओवरहेड बहुत अधिक होगा, इसलिए ' या तो एक वितरित मोड में या किसी प्रकार के समर्पित टोपोलॉजी में इन्फिनस्पैन को चलाना होगा, और अचानक हाइबरनेट को कैश से पढ़ने के लिए नेटवर्क पर बाहर जाना होगा। इसके अलावा, Infinispan केवल जावा में काम करता है। यदि आपके पास अन्य भाषाएं हैं, तो आपको अन्य कैशिंग समाधानों की आवश्यकता होगी। डेटाबेस तक पहुँचने से पहले आपके एप्लिकेशन से आपकी वेब सेवा पर जाने का नेटवर्क ओवरहेड बहुत अधिक जटिल कैशिंग समाधानों का उपयोग करने की आवश्यकता से जल्दी भर जाता है जो आमतौर पर अपने स्वयं के ओवरहेड के साथ आते हैं।
इसके अतिरिक्त, आपके REST API की HTTP परत एक और मूल्यवान कैशिंग तंत्र प्रदान करती है। आपके REST API के लिए आपके सर्वर उनकी प्रतिक्रियाओं पर कैशिंग हेडर लगा सकते हैं, और इन प्रतिक्रियाओं को नेटवर्क लेयर पर कैश्ड किया जा सकता है, जो असाधारण रूप से अच्छी तरह से मापता है। एक छोटे से सेटअप में, एक या दो सर्वरों के साथ, आपका सबसे अच्छा शर्त यह है कि जब आप डेटाबेस से बात करते हैं, तो एप्लिकेशन में मेमोरी कैश का उपयोग करें, लेकिन एक बड़े प्लेटफ़ॉर्म में कई सर्वरों पर चलने वाले एप्लिकेशन के साथ, आप इसका लाभ उठाना चाहते हैं आपके कैशिंग को संभालने के लिए नेटवर्क, क्योंकि जब स्क्वीड या वार्निश या नग्नेक्स जैसी किसी चीज़ को ठीक से कॉन्फ़िगर किया जाता है, तो अपेक्षाकृत कम हार्डवेयर पर पागल स्तर को बढ़ा सकता है। थ्रूपुट के प्रति सेकंड के हजारों या लाखों अनुरोध, HTTP कैश से करने के लिए बहुत सस्ता है, जितना कि एप्लिकेशन सर्वर या डेटाबेस से।
उसके शीर्ष पर, सभी क्लाइंट्स का एक टन होना, जो आपके डेटाबेस पर इंगित करता है, उन सभी को कुछ सर्वरों पर इंगित करने के बजाय, जो डेटाबेस के लिए महत्वपूर्ण बिंदु हैं, डेटाबेस और कनेक्शन को बहुत कठिन बना सकते हैं। सामान्य तौर पर, एक एप्लिकेशन सर्वर पर अधिकांश वास्तविक कार्यभार आवेदन सामग्री है; डेटाबेस से डेटा के वापस आने का इंतज़ार अक्सर समय लेने वाला होता है, लेकिन आमतौर पर बहुत कम खर्चीला नहीं होता। आपको अपने एप्लिकेशन के कार्यभार को संभालने के लिए 40 सर्वरों की आवश्यकता हो सकती है, लेकिन डेटाबेस से डेटा प्राप्त करने के लिए संभवतः आपको 40 सर्वरों की आवश्यकता नहीं है। यदि आप उस कार्य को एक वेब सेवा को समर्पित करते हैं, तो वेब सेवा संभवतः शेष एप्लिकेशन की तुलना में बहुत कम सर्वर पर चल रही होगी, जिसका अर्थ है कि आपको डेटाबेस के लिए बहुत कम कनेक्शन की आवश्यकता होगी। जो महत्वपूर्ण है, क्योंकि डेटाबेस आमतौर पर '
TLDR; अपने डेटा एक्सेस को ट्यून करना, स्केल करना और कैश करना आसान है जब यह एक ऐसी चीज़ है जो किसी एकल समर्पित वेब सेवा के अंदर होती है, तो यह तब होती है जब यह कुछ ऐसा होता है जो विभिन्न भाषाओं और तकनीकों का उपयोग करके कई अलग-अलग अनुप्रयोगों में होता है।
अंतिम विचार
कृपया इस सोच से दूर न हों "अरे वाह, मुझे हमेशा अपना डेटा प्राप्त करने के लिए REST API का उपयोग करना चाहिए" या "यह बेवकूफ कहना चाह रहा है कि हम इसे गलत कर रहे हैं क्योंकि हमारा वेब ऐप डेटाबेस से सीधे बात करता है, लेकिन हमारा सामान ठीक काम करता है! " । मैं जो प्रमुख बिंदु बनाने की कोशिश कर रहा हूं वह यह है कि विभिन्न प्रणालियों और विभिन्न व्यवसायों की अलग-अलग आवश्यकताएं हैं; बहुत सारे मामलों में, अपने डेटाबेस के सामने REST API लगाना वास्तव में मायने नहीं रखता है। यह एक अधिक जटिल वास्तुकला है जिसे उस जटिलता को सही ठहराने की आवश्यकता है। लेकिन जब जटिलता का वारंट होता है, तो REST API होने में एक टन लाभ होता है। विभिन्न चिंताओं को तौलना और अपने सिस्टम के लिए सही दृष्टिकोण का चयन करने में सक्षम होना एक अच्छा इंजीनियर बनाता है।
इसके अतिरिक्त, अगर REST API को डिबगिंग चीजों के तरीके से मिल रहा है, तो उस चित्र में कुछ गलत या गायब होने की संभावना है। मुझे विश्वास नहीं है कि जोड़ा अमूर्त परत आंतरिक रूप से कठिन डिबगिंग बनाता है। जब मैं बड़े, एन-टियर सिस्टम के साथ काम करता हूं, तो मुझे यह सुनिश्चित करना पसंद है कि मेरे पास एक वितरित लॉगिंग संदर्भ है। शायद जब कोई उपयोगकर्ता एक अनुरोध शुरू करता है, तो उस अनुरोध के लिए एक GUID उत्पन्न करें और उस उपयोगकर्ता के उपयोगकर्ता नाम और उनके द्वारा किए गए अनुरोध को लॉग इन करें। उसके बाद, उस GUID को पास करें, जब आपके एप्लिकेशन अन्य सिस्टम से बात करते हैं। उचित लॉग एकत्रीकरण और अनुक्रमण के साथ, आप समस्या की रिपोर्ट करने वाले उपयोगकर्ता के लिए अपने पूरे मंच को क्वेरी कर सकते हैं, और उनके सभी कार्यों में दृश्यता हो सकती है और वे सिस्टम के माध्यम से जल्दी से पहचानते हैं कि चीजें कहां गलत हुईं। फिर, यह एक और अधिक जटिल वास्तुकला है,
स्रोत:
http://alistair.cockburn.us/Hexagonal+altecture
https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing