क्या डीबी में कार्यक्षमता स्केलेबिलिटी के लिए एक रोड ब्लॉक है?


17

मैं प्रश्न को सही शीर्षक देने में सक्षम नहीं हो सकता। लेकिन यहाँ यह है,

हम धन प्रबंधन के लिए वित्तीय पोर्टल विकसित कर रहे हैं। हम आवेदन का उपयोग करने के लिए 10000 से अधिक ग्राहकों की उम्मीद कर रहे हैं। पोर्टल शेयर बाजार के तकनीकी विश्लेषण के आधार पर विभिन्न प्रदर्शन विश्लेषणों की गणना करता है।

हमने डेटाबेस के माध्यम से संग्रहीत प्रक्रियाओं, उपयोगकर्ता परिभाषित कार्यों, ट्रिगर आदि के माध्यम से बहुत अधिक कार्यक्षमता विकसित की है। हमने सोचा कि हम सी # कोड की तुलना में डेटाबेस में सीधे प्रदर्शन कर भारी प्रदर्शन को बढ़ा सकते हैं। और हमें वास्तव में एक विशाल प्रदर्शन को बढ़ावा मिला।

जब मैंने हमारे सीटीओ की उपलब्धि के बारे में डींग मारने की कोशिश की, तो उसने काउंटर के बजाय डेटाबेस में कार्यशीलता को लागू करने के मेरे निर्णय पर सवाल उठाया। उनके अनुसार इस तरह के अनुप्रयोगों से स्केलेबिलिटी की समस्या होती है। उनके शब्दों में "इन दिनों चीजों को स्मृति / कैश में रखा जाता है। समय के साथ क्लस्टर डेटा को प्रबंधित करना कठिन है। फेसबुक, Google डेटाबेस में कुछ भी नहीं है। यह पतले सर्वर और मोटे ग्राहकों का युग है। DB का उपयोग केवल सादे डेटा को स्टोर करने के लिए किया जाता है। और कार्यक्षमता को डेटाबेस से पूरी तरह से हटा दिया जाना चाहिए। "

क्या आप लोग मुझे कुछ सुझाव दे सकते हैं कि क्या वह सही है। वास्तुकार ऐसे आवेदन के बारे में कैसे जाएं?


3
"और हमें वास्तव में एक विशाल प्रदर्शन को बढ़ावा मिला" क्या तुलना में? जब आपने ग्राहक पर समान कार्यक्षमता लागू नहीं की, तो आप कैसे जानते हैं?
डॉक ब्राउन

3
मुझे लगता है कि यह सामान्य होगा - यह परियोजना, डेटा कार्यान्वयन और टीम के कौशल पर निर्भर करता है।
डैनियल इवानकोव

1
आपको अपने सीटीओ से पूछना चाहिए कि उन्हें क्या लगता है कि डेटाबेस उनकी पसंदीदा तकनीकों का उपयोग नहीं कर रहे हैं और संग्रहीत प्रक्रियाएं "कोड" के रूप में योग्य क्यों नहीं हैं।
ब्लरफुल

3
फेसबुक और Google को अधिकांश अनुप्रयोगों के लिए एक पूरी तरह से अलग पैमाने पर समस्याएं हैं - बाजार से डेटा के संदर्भ में डेटा की मात्रा के साथ एक समस्या हो सकती है, लेकिन समकालीन SQL डेटाबेस डेटा की कंपित मात्रा के साथ सामना करने के लिए बनाए जाते हैं।
मर्फ़

1
मैं शायद आपके CTO की तरह ही सोचूंगा जब तक आप साबित नहीं कर सकते कि उसका समाधान अपर्याप्त था और इसे प्रबंधित करने के अन्य तरीके नहीं थे। संग्रहीत कार्यविधियाँ, विशेष रूप से जब उनकी संख्या बड़ी हो जाती है, तो यदि आवश्यक हो तो अन्य DBs में जाने के लिए एक जबरदस्त अवरोध का कारण बनता है ... भविष्य की भविष्यवाणी नहीं कर सकता।
रिग

जवाबों:


23

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

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

DB में कोड का प्रदर्शन:माध्यमिक निष्पादन प्रभाव, जैसे "निष्पादन योजनाओं का कैशिंग" बहस करना अधिक कठिन है। कभी-कभी, कैश की गई निष्पादन योजनाएं बहुत ही नकारात्मक चीज हो सकती हैं, अगर गलत निष्पादन योजना को कैश किया गया हो। आपके RDBMS के आधार पर, आप इनमें से सबसे अधिक प्राप्त कर सकते हैं, लेकिन आप अधिकांश मामलों में पैरामीट्रिज्ड SQL पर नहीं मिलेंगे, (वे योजनाएं आमतौर पर कैश की जाती हैं, भी)। मैं यह भी तर्क दूंगा कि अधिकांश संकलित या JIT'ed भाषाएँ आमतौर पर बुनियादी कार्यों और गैर-संबंधपरक प्रोग्रामिंग (स्ट्रिंग हेरफेर, लूप, आदि) के लिए अपने एसक्यूएल समकक्षों (जैसे टी-एसक्यूएल या पीएल / एसक्यूएल) से बेहतर प्रदर्शन करती हैं, इसलिए आप संख्या में कमी करने के लिए यदि आपने जावा या सी # का उपयोग किया है, तो वहां कुछ भी खोना नहीं है। ठीक-ठीक अनुकूलन भी काफी कठिन है - DB पर, आप ' अक्सर केवल आपके डेटा संरचना के रूप में एक सामान्य बी-ट्री (इंडेक्स) के साथ अटक जाता है। निष्पक्ष होने के लिए, एक पूर्ण विश्लेषण, जिसमें लंबे समय तक चलने वाले लेनदेन, लॉक एस्केलेशन, आदि जैसी चीजें शामिल हैं, किताबें भर सकती हैं।

स्थिरता: एसक्यूएल एक अद्भुत भाषा है जो इसे करने के लिए डिज़ाइन की गई थी। मुझे यकीन नहीं है कि यह एप्लिकेशन लॉजिक के लिए बहुत अच्छा है। अधिकांश टूलिंग और प्रथाएं जो हमारे जीवन को सहनीय बनाती हैं (TDD, रीफैक्टरिंग, आदि) डेटाबेस प्रोग्रामिंग पर लागू करना मुश्किल है।

प्रदर्शन बनाम मापनीयता:इन शब्दों को स्पष्ट करने के लिए, मेरा मतलब है: प्रदर्शन यह है कि आप जिस लोड को कम लोड मान रहे हैं, उसके लिए आप अपने सिस्टम (और उपयोगकर्ता पर वापस) के माध्यम से जाने के लिए एक ही अनुरोध की अपेक्षा कितनी जल्दी करेंगे। यह अक्सर उन चीजों से सीमित होगा जैसे कि यह उन भौतिक परतों की संख्या के माध्यम से होती है, जो उन परतों को कितनी अच्छी तरह से अनुकूलित करते हैं, आदि। स्केलेबिलिटी उपयोगकर्ताओं की संख्या / भार बढ़ने के साथ प्रदर्शन में परिवर्तन होता है। आपके पास मध्यम / कम प्रदर्शन (अनुरोध के लिए 5 सेकंड +) हो सकता है, लेकिन भयानक स्केलेबिलिटी (लाखों उपयोगकर्ताओं का समर्थन करने में सक्षम)। आपके मामले में, आप शायद अच्छे प्रदर्शन का अनुभव करेंगे, लेकिन आपकी मापनीयता इस बात से बंधी होगी कि आपका शारीरिक रूप से कितना बड़ा सर्वर बन सकता है। कुछ बिंदु पर, आप उस सीमा को मारेंगे, और तेज करने जैसी चीजों के लिए मजबूर होंगे, जो कि अनुप्रयोग की प्रकृति के आधार पर संभव नहीं हो सकता है।

समय से पहले अनुकूलन: अंततः, मुझे लगता है कि आपने समय से पहले अनुकूलन की गलती की है। जैसा कि दूसरों ने बताया है, आपके पास वास्तव में माप नहीं है कि अन्य दृष्टिकोण कैसे काम करेंगे। ठीक है, हम हमेशा एक सिद्धांत को साबित करने या अस्वीकार करने के लिए पूर्ण-पैमाने के प्रोटोटाइप का निर्माण नहीं कर सकते हैं ... लेकिन सामान्य तौर पर, मैं हमेशा एक दृष्टिकोण को चुनने में संकोच करूंगा जो प्रदर्शन के लिए स्थिरता (शायद एक आवेदन की सबसे महत्वपूर्ण गुणवत्ता) को पार करता है ।

संपादित करें: सकारात्मक नोट पर, ऊर्ध्वाधर स्केलिंग कुछ मामलों में काफी दूर तक फैल सकती है। जहां तक ​​मुझे पता है, एसओ काफी समय तक एक ही सर्वर पर चला। मुझे यकीन नहीं है कि यह आपके 10 000 उपयोगकर्ताओं से कैसे मेल खाता है (मुझे लगता है कि यह आपके सिस्टम में वे क्या कर रहे हैं की प्रकृति पर निर्भर करेगा), लेकिन यह आपको एक विचार देता है कि क्या किया जा सकता है (वास्तव में, वहाँ बहुत दूर हैं अधिक प्रभावशाली उदाहरण, यह सिर्फ एक लोकप्रिय होने के लिए होता है जिसे लोग आसानी से समझ सकते हैं)।

EDIT 2: कुछ बातों को स्पष्ट करने और उन पर टिप्पणी करने के लिए:

  • पुन: परमाणु स्थिरता - ACID स्थिरता प्रणाली की एक आवश्यकता हो सकती है। उपरोक्त वास्तव में उस के खिलाफ बहस नहीं करता है, और आपको महसूस करना चाहिए कि ACID स्थिरता को आपको DB के अंदर अपने सभी व्यावसायिक तर्क चलाने की आवश्यकता नहीं है। जिस कोड को डीबी में रखने की आवश्यकता नहीं है, उसे स्थानांतरित करके , आप इसे बाकी के DB के भौतिक वातावरण में चलाने के लिए विवश कर रहे हैं - यह आपके DB के वास्तविक डेटा प्रबंधन भाग के समान हार्डवेयर संसाधनों के लिए प्रतिस्पर्धा कर रहा है। अन्य DB सर्वर (लेकिन वास्तविक डेटा नहीं) के लिए केवल कोड को स्केल करने के लिए - यकीन है, यह संभव हो सकता है , लेकिन क्या आप वास्तव में यहां प्राप्त कर रहे हैं, इसके अलावा ज्यादातर मामलों में अतिरिक्त लाइसेंसिंग लागत? उन चीजों को रखें जिन्हें DB पर, DB से दूर होने की आवश्यकता नहीं है।
  • पुन: SQL / C # प्रदर्शन - चूंकि यह रुचि का विषय लगता है, आइए चर्चा में थोड़ा जोड़ दें। आप निश्चित रूप से मूल / जावा / सी # कोड को डीबी के अंदर चला सकते हैं, लेकिन जहां तक ​​मुझे पता है, कि यहां चर्चा नहीं की जा रही है - हम टी-एसक्यूएल बनाम सी # जैसे कुछ में विशिष्ट एप्लिकेशन कोड को लागू करने की तुलना कर रहे हैं। ऐसी कई समस्याएं हैं जो अतीत में संबंधपरक कोड के साथ हल करना मुश्किल है - उदाहरण के लिए "अधिकतम समवर्ती लॉगिन" समस्या पर विचार करें, जहां आपके पास एक लॉग या लॉगआउट, और समय का संकेत देने वाले रिकॉर्ड हैं, और आपको बाहर काम करने की आवश्यकता है किसी एक समय में लॉग इन करने वाले उपयोगकर्ताओं की अधिकतम संख्या थी। सरलतम संभव समाधान है कि रिकॉर्ड के माध्यम से पुनरावृत्ति करें और एक काउंटर बढ़ा / घटाकर रखें क्योंकि आप लॉगइन / लॉगआउट का सामना करते हैं, और इस मूल्य का अधिकतम ट्रैक रखते हैं।हो सकता है, मुझे नहीं पता), सबसे अच्छा आप कर सकते हैं एक कर्सर है (विशुद्ध रूप से संबंधपरक समाधान जटिलता के विभिन्न आदेशों पर हैं, और खराब प्रदर्शन में थोड़ी देर के परिणाम का उपयोग करके इसे हल करने का प्रयास करते हैं)। इस मामले में, हां, सी # समाधान वास्तव में टी-एसक्यूएल, अवधि में आप क्या हासिल कर सकते हैं, उससे तेज है। यह दूर की कौड़ी लग सकता है, लेकिन यह समस्या वित्तीय प्रणालियों में खुद को आसानी से प्रकट कर सकती है, यदि आप रिश्तेदार परिवर्तनों का प्रतिनिधित्व करने वाली पंक्तियों के साथ काम कर रहे हैं, और उन पर विंडो एकत्रीकरण की गणना करने की आवश्यकता है। संग्रहित खरीद इनवॉइस भी अधिक महंगे होते हैं - एक ट्रिवियल एसपी को एक लाख बार चालान करें और देखें कि सी # फ़ंक्शन को कॉल करने की तुलना कैसे की जाती है। मैंने ऊपर कुछ अन्य उदाहरणों पर संकेत दिया है - मैंने अभी तक किसी को भी टी-एसक्यूएल (जो वास्तव में कुछ लाभ देता है) में एक उचित हैश तालिका को लागू करने का सामना नहीं किया है, जबकि सी # में करना बहुत आसान है। फिर, वहाँ चीजें हैं जो DBs में कमाल कर रहे हैं, और चीजें हैं जो वे पर इतना भयानक नहीं हैं। जैसे मैं C # में JOINs, SUMs और GROUP BY नहीं करना चाहूंगा, मैं T- SQL में विशेष रूप से सीपीयू इंटेंसिव कुछ भी लिखना नहीं चाहता।

डेटाबेस में कार्यक्षमता को धक्का देने वाले कारणों में से एक यह है कि आवेदन स्तर कोड की तुलना में बहुत कम छोटी गाड़ी है। SQL डिक्लेरेटिव है और ऐसी कई समस्याओं से ग्रस्त नहीं है जो अनिवार्यताएं करती हैं।
wobbily_col

स्थिरता के बारे में, SQL सर्वर डेटा उपकरण स्थिरता का उपयोग करना एक चिंच है। वास्तव में किसी भी nontrivial डेटाबेस (5 से अधिक तालिकाओं वाला एक) मैं इसे एक आवश्यकता मानूंगा।
जॉन 49

4

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

मुझे यकीन नहीं है कि आपके सीटीओ को स्केलेबिलिटी के मुद्दों के बारे में उसकी जानकारी मिल रही है, लेकिन आपने जो कहा है, उससे यह नहीं लगता है कि उसके पास सॉफ्टवेयर फैशन ट्रेंड के अलावा वर्तमान वास्तु निर्णय पर सवाल उठाने के लिए कोई वास्तविक कारण हैं। इस तरह के रुझानों पर वास्तु निर्णय लेना आमतौर पर एक बुरा विचार है।


1
+1 के लिएScalability is all about how you manage global state and data inter-dependence.
एस्टीफेनी वेलेज़

2

और हमें वास्तव में एक विशाल प्रदर्शन को बढ़ावा मिला।

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

इस प्रकार के बिक्री योग्य अनुप्रयोगों के लिए सामान्य दृष्टिकोण एसओए के माध्यम से किया जाता है । क्योंकि लंबे समय में, यह आपके प्रोजेक्ट में नए क्लाइंट एप्लिकेशन जोड़ने का सबसे आसान तरीका है।

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


2

आपका CTO 100% गलत है।

आपका वित्तीय संख्या चाहिए हर समय सीमा में रहें। इसका मतलब है कि आपको एसीआईडी ​​की जरूरत है और रिलेशनल डीबी बीमा करने के लिए सबसे अच्छी जगह है। NoSql DB का प्रदर्शन लाभ आमतौर पर ACID के व्यय पर है और यह Google और Facebook के लिए ठीक है, जिसमें वित्तीय व्यवस्था नहीं है।

यह कहना कि C # SQL कोड से बेहतर प्रदर्शन करता है, वह भी मूर्खतापूर्ण है ...


यह कहने के लिए कि C # SQL कोड से बेहतर प्रदर्शन करता है वह भी मूर्खतापूर्ण है ... - लेकिन आप इस बात से इनकार नहीं कर रहे हैं कि C # कोड अधिक स्केलेबल है, सही है?
जिम जी।

नहीं इसकी अधिक स्केलेबल नहीं है, क्योंकि यह नहीं है कि बोतल की गर्दन कहां है, मैं एसक्यूएल कोड (डेटा नहीं) को क्षैतिज रूप से आसानी से माप सकता हूं जैसे कि मैं आसानी से सी # कोड को स्केल कर सकता हूं।
मोरोंस

@JimG। बस स्पष्ट करने के लिए, "मैं एसक्यूएल कोड (डेटा नहीं) को क्षैतिज रूप से आसानी से माप सकता हूं जैसे कि मैं क्षैतिज रूप से सी # कोड को स्केल कर सकता हूं" अगर यह ऐसा करने के लिए डिज़ाइन किया गया था ... समान सी # के रूप में इसे स्केल करने के लिए डिज़ाइन किया जाना चाहिए। आप सी # पैमानों को बेहतर नहीं कह सकते, यह भाषा की योजना बनाने का मामला है।
मोरोंस सिप

@JimG .: वह सॉफ्टवेयर जो किसी भी भाषा में नहीं लिखा जा सकता है, जिसमें C # शामिल है। इसके नमक के लायक किसी भी डेटाबेस में उनके मूल SQL-ish कार्यान्वयन के अलावा अन्य भाषाओं में लिखी गई प्रक्रियाएं संग्रहीत की जा सकती हैं, और लोग जो ACSQL के साथ गहरे अंत में जाते हैं उन स्थितियों में जिन्हें ACID की आवश्यकता होती है, आमतौर पर ज्यादातर पहियों को फिर से आविष्कार करते हैं जो अच्छी तरह से किए गए हैं DBMS द्वारा कार्यान्वित किया गया।
ब्लरफ्ल सिप

@ मॉरन्स: मुझे लगता है कि हम सहमत हैं। मैं वास्तव में "एसक्यूएल" के साथ डेटा को भ्रमित कर रहा था । डेटाबेस को स्केल करना बहुत अधिक महंगा है।
जिम जी। 15

2

कभी भी किसी ने स्केलेबिलिटी और Google / Facebook / Twitter / etc का उल्लेख किया है, यह एक लाल हेरिंग है। जब तक आप अनिवार्य रूप से एक ही सेवा प्रदान नहीं कर रहे हैं, तब तक उनके लिए क्या काम करना आपके लिए उचित नहीं हो सकता है। सामान्य तौर पर, यदि आप एकल मशीन से आठ-मशीन क्लस्टर में स्केल कर सकते हैं, तो आपने संभवतः अपने सभी ठिकानों को कवर कर लिया है। जब तक आपको एक दिन में 20M पृष्ठ दृश्य परोसने के लिए एक कठिन व्यावसायिक आवश्यकता नहीं है, हाइपर-स्केलिंग के बारे में चिंता न करें। वह करें जो आपके एप्लिकेशन की वास्तविक आवश्यकताओं के लिए समझ में आता है , और जब यह स्पष्ट हो जाए कि आपको इसकी आवश्यकता है, तो स्केलिंग के बारे में चिंता करें। और मत भूलो, अधिकांश डेटाबेस सर्वरों को भी क्लस्टर किया जा सकता है, इसलिए सिर्फ इसलिए कि एक डेटाबेस में सभी का मतलब यह नहीं है कि यह एक सर्वर पर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.