लेकिन क्या यह वास्तव में महत्वपूर्ण है? विचार करें कि यूआई को एपीआई के लिए एक नेटवर्क कॉल करना है; यह बहुत बड़ा है (मिलीसेकंड के परिमाण का क्रम)। डेटाबेस को चीजों को स्मृति में रखने के लिए अनुकूलित किया जाता है और बहुत तेजी से रीड को निष्पादित करता है, (उदाहरण के लिए। SQL सर्वर लोड करता है और रैम में सब कुछ रखता है और अगर यह कर सकता है तो आपके सभी मुफ्त रैम का लगभग उपभोग करता है)।
तर्क
सिद्धांत रूप में, आप सही हैं। हालांकि, इस तर्क के साथ कुछ खामियां हैं:
आपने जो बताया, उससे यह स्पष्ट नहीं होता है कि आपने वास्तव में अपने ऐप का परीक्षण किया है या नहीं। दूसरे शब्दों में, क्या आप वास्तव में जानते हैं कि ऐप से एपीआई तक नेटवर्क सबसे धीमा घटक है? क्योंकि यह सहज है, यह मानना आसान है कि यह है। हालांकि, प्रदर्शन की चर्चा करते समय, आपको कभी भी अनुमान नहीं लगाना चाहिए। मेरे नियोक्ता में, मैं प्रदर्शन का नेतृत्व कर रहा हूं। जब मैं पहली बार शामिल हुआ, तो लोग सीडीएन, प्रतिकृति, आदि के बारे में अंतर्ज्ञान के आधार पर बात करते रहे कि अड़चन क्या होनी चाहिए। पता चलता है, हमारी सबसे बड़ी प्रदर्शन समस्याएं डेटाबेस क्वेरीज़ का खराब प्रदर्शन कर रही थीं।
आप ऐसा इसलिए कह रहे हैं क्योंकि डेटाबेस डेटा को पुनः प्राप्त करने में अच्छा है, क्योंकि डेटाबेस आवश्यक रूप से चरम प्रदर्शन पर चल रहा है, इसका उपयोग बेहतर तरीके से किया जा रहा है, और इसमें सुधार के लिए कुछ भी नहीं किया जा सकता है। दूसरे शब्दों में, डेटाबेस तेज़ होने के लिए डिज़ाइन किए गए हैं, इसलिए मुझे कभी भी इसके बारे में चिंता नहीं करनी चाहिए। सोचने की एक और खतरनाक रेखा। यह कहने की तरह है कि एक कार जल्दी से स्थानांतरित करने के लिए है, इसलिए मुझे तेल बदलने की आवश्यकता नहीं है।
सोचने का यह तरीका एक बार में एक ही प्रक्रिया को मानता है, या दूसरा तरीका, कोई संगति नहीं है। यह मानता है कि एक अनुरोध दूसरे अनुरोध के प्रदर्शन को प्रभावित नहीं कर सकता है। संसाधनों को साझा किया जाता है, जैसे डिस्क I / O, नेटवर्क बैंडविड्थ, कनेक्शन पूल, मेमोरी, सीपीयू साइकिल, आदि। इसलिए, साझा डेटाबेस के एक डेटाबेस कॉल के उपयोग को कम करने से इसे अन्य अनुरोधों को धीमा करने से रोका जा सकता है। जब मैं पहली बार अपने वर्तमान नियोक्ता से जुड़ा, तो प्रबंधन का मानना था कि 3 सेकंड डेटाबेस क्वेरी को ट्यून करना समय की बर्बादी है। 3 सेकंड इतना कम है, इस पर समय क्यों बर्बाद करें? क्या हम सीडीएन या कम्प्रेशन या कुछ और के साथ बेहतर नहीं होंगे? लेकिन अगर मैं 1 सेकंड में 3 सेकंड का क्वेरी रन बना सकता हूं, तो एक इंडेक्स जोड़कर कह सकते हैं, कि 2/3 कम अवरुद्ध है, 2/3 कम समय एक थ्रेड पर कब्जा करने में बिताया है, और अधिक महत्वपूर्ण बात, डिस्क से पढ़ा गया कम डेटा।
सिद्धांत
एक आम धारणा है कि सॉफ्टवेयर प्रदर्शन बस गति के बारे में है ।
विशुद्ध रूप से गति के दृष्टिकोण से, आप सही हैं। एक प्रणाली केवल सबसे धीमी घटक के रूप में तेजी से होती है। यदि आपने अपना कोड प्रोफाइल किया है और पाया है कि इंटरनेट सबसे धीमा घटक है, तो बाकी सब कुछ स्पष्ट रूप से सबसे धीमा हिस्सा नहीं है।
हालांकि, ऊपर दिए गए, मुझे आशा है कि आप देख सकते हैं कि संसाधन विवाद, अनुक्रमण की कमी, खराब लिखित कोड आदि, प्रदर्शन में आश्चर्यजनक अंतर पैदा कर सकते हैं।
अनुमान
एक अंतिम बात। आपने उल्लेख किया है कि ऐप से एपीआई तक नेटवर्क कॉल की तुलना में एक डेटाबेस कॉल सस्ता होना चाहिए। लेकिन आपने यह भी बताया कि ऐप और एपीआई सर्वर एक ही LAN में हैं। इसलिए, दोनों नेटवर्क कॉल के रूप में तुलनीय नहीं हैं? दूसरे शब्दों में, आप यह क्यों मान रहे हैं कि जब वे दोनों एक ही उपलब्ध बैंडविड्थ हैं तो एपीआई ट्रांसफर डेटाबेस ट्रांसफर की तुलना में धीमी गति के आदेश हैं? बेशक प्रोटोकॉल और डेटा संरचनाएं अलग-अलग हैं, मुझे वह मिलता है, लेकिन मैं इस धारणा का विवाद करता हूं कि वे भिन्नता के आदेश हैं।
जहां यह मुरकी हो जाती है
यह पूरा सवाल "एकाधिक" बनाम "एकल" डेटाबेस कॉल के बारे में है। लेकिन यह स्पष्ट नहीं है कि कितने एकाधिक हैं। जैसा कि मैंने ऊपर कहा था, अंगूठे के एक सामान्य नियम के कारण, मैं आवश्यकतानुसार कुछ डेटाबेस कॉल करने की सलाह देता हूं। लेकिन वह केवल अंगूठे का एक नियम है।
यहाँ क्यों है:
- डेटा पढ़ने में डेटाबेस महान हैं। वे भंडारण इंजन हैं। हालाँकि, आपका व्यावसायिक तर्क आपके आवेदन में रहता है। यदि आप एक नियम बनाते हैं कि प्रत्येक एपीआई कॉल का परिणाम ठीक एक डेटाबेस कॉल में होता है, तो आपका व्यावसायिक तर्क डेटाबेस में समाप्त हो सकता है। शायद यह ठीक है। बहुत सारे सिस्टम ऐसा करते हैं। लेकिन कुछ नहीं। यह लचीलेपन के बारे में है।
- कभी-कभी अच्छी डीकोपलिंग प्राप्त करने के लिए, आप 2 डेटाबेस कॉल को अलग करना चाहते हैं। उदाहरण के लिए, शायद हर HTTP अनुरोध को जेनेरिक सुरक्षा फ़िल्टर के माध्यम से रूट किया जाता है जो DB से सत्यापित करता है कि उपयोगकर्ता के पास सही अधिकार हैं। यदि वे करते हैं, तो उस URL के लिए उपयुक्त फ़ंक्शन को निष्पादित करने के लिए आगे बढ़ें। वह फ़ंक्शन डेटाबेस के साथ इंटरैक्ट कर सकता है।
- डेटाबेस को लूप में कॉल करना। यही कारण है कि मैंने पूछा कि कितने बहु है। ऊपर के उदाहरण में, आपके पास 2 डेटाबेस कॉल होंगे। 2 ठीक है। 3 ठीक हो सकता है। एन ठीक नहीं है। यदि आप डेटाबेस को लूप में कहते हैं, तो आपने अब प्रदर्शन रैखिक बना दिया है, जिसका अर्थ है कि लूप के इनपुट में अधिक समय लगेगा। इसलिए स्पष्ट रूप से कहा जा रहा है कि एपीआई नेटवर्क का समय सबसे धीमा है, यह पूरी तरह से विसंगतियों को दिखाता है, जैसे आपके 1% ट्रैफ़िक को लंबे समय तक खोजे जाने वाले लूप के कारण, जो डेटाबेस को 10,000 बार कॉल करता है।
- कभी-कभी कुछ चीजें ऐसी होती हैं जो कुछ जटिल गणनाओं की तरह होती हैं। आपको डेटाबेस से कुछ डेटा पढ़ने की आवश्यकता हो सकती है, कुछ गणनाएं कर सकते हैं, फिर परिणामों के आधार पर, एक दूसरे डेटाबेस कॉल के पैरामीटर को पास कर सकते हैं (शायद कुछ परिणाम लिखने के लिए)। यदि आप केवल एक बार डेटाबेस को कॉल करने के लिए एक कॉल (एक संग्रहीत प्रक्रिया की तरह) में जोड़ते हैं, तो आपने अपने आप को डेटाबेस का उपयोग करने के लिए मजबूर किया है, जो ऐप सर्वर पर बेहतर हो सकता है।
- लोड संतुलन: आपके पास 1 डेटाबेस (संभवतः) और कई लोड संतुलित एप्लिकेशन सर्वर हैं। इसलिए, ऐप जितना अधिक काम करता है और डेटाबेस उतना कम करता है, इसे स्केल करना आसान होता है क्योंकि सेटअप डेटाबेस प्रतिकृति की तुलना में ऐप सर्वर को जोड़ना आमतौर पर आसान होता है। पिछले बुलेट बिंदु के आधार पर, यह SQL क्वेरी को चलाने के लिए समझ में आता है, फिर आवेदन में सभी गणना करें, जो कई सर्वरों में वितरित की जाती है, और फिर समाप्त होने पर परिणाम लिखें। यह बेहतर थ्रूपुट दे सकता है (भले ही समग्र लेनदेन समय समान हो)।
टी एल; डॉ
TLDR: जब हम पहले से ही LAN पर नेटवर्क कॉल कर रहे हों, तो क्या कई डेटाबेस कॉल्स की चिंता करना बहुत महत्वपूर्ण है? यदि हां, तो क्यों?
हां, लेकिन केवल कुछ हद तक। आपको व्यावहारिक होने पर डेटाबेस कॉल की संख्या को कम करने की कोशिश करनी चाहिए, लेकिन उन कॉल्स को संयोजित न करें जिनके पास संयोजन के लिए सिर्फ एक-दूसरे के साथ कुछ नहीं करना है। इसके अलावा, हर कीमत पर डेटाबेस को लूप में कॉल करने से बचें।