क्या वेब एपीआई के लिए नेटवर्क कॉल के साथ म्यूथल डेटाबेस डेटाबेस वास्तव में महत्वपूर्ण हैं?


16

मेरे एक नियोक्ता में, हमने एक REST पर काम किया (लेकिन यह SOAP पर भी लागू होता है) API। क्लाइंट, जो कि अनुप्रयोग UI है, API पर वेब (विशिष्ट उत्पादन परिनियोजन में LAN) पर कॉल करेगा। एपीआई डेटाबेस को कॉल करेगा।

एक विषय जो हमारी चर्चाओं में आता है, वह है प्रदर्शन: टीम के कुछ लोगों का मानना ​​है कि प्रदर्शन के कारण आपको एक ही एपीआई कॉल से कई डेटाबेस कॉल (आमतौर पर पढ़ते हैं) नहीं होने चाहिए; आपको उन्हें अनुकूलित करना चाहिए ताकि प्रत्येक एपीआई कॉल में केवल (बिल्कुल) एक डेटाबेस कॉल हो।

लेकिन क्या यह वास्तव में महत्वपूर्ण है? विचार करें कि यूआई को एपीआई के लिए एक नेटवर्क कॉल करना है; यह बहुत बड़ा है (मिलीसेकंड के परिमाण का क्रम)। डेटाबेस को चीजों को स्मृति में रखने के लिए अनुकूलित किया जाता है और बहुत तेजी से रीड को निष्पादित करता है, (उदाहरण के लिए। SQL सर्वर लोड करता है और रैम में सब कुछ रखता है और अगर यह कर सकता है तो आपके सभी मुफ्त रैम का लगभग उपभोग करता है)।

TLDR: जब हम पहले से ही LAN पर नेटवर्क कॉल कर रहे हों, तो क्या कई डेटाबेस कॉल्स की चिंता करना बहुत महत्वपूर्ण है? यदि हां, तो क्यों?

स्पष्ट होने के लिए, मैं परिमाण के क्रम के बारे में बात कर रहा हूं - मुझे पता है कि यह बारीकियों पर निर्भर करता है (मशीन हार्डवेयर, एपीआई और डीबी की पसंद, आदि) अगर मेरे पास एक फोन है जो ओ (मिलीसेकंड) लेता है, तो डीबी के लिए अनुकूलन करता है। कॉल जो परिमाण के एक आदेश को कम लेते हैं, वास्तव में बात करते हैं? या इस से भी ज्यादा समस्या है?

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


क्या एपीआई परत और डेटाबेस के बीच एक और नेटवर्क कॉल नहीं है?
साइन

4
आपके समय परीक्षण क्या दिखा?
डैन पिचेलमैन

@ साइन करें एपीआई और डीबी के बीच कोई नेटवर्क कॉल नहीं है। वे उसी मशीन पर होने की गारंटी देते हैं, जो मैं समझता हूं।
ashes999

@DanPichelman यही तो मैं भी पूछ रहा हूँ। लगता है कि कोई भी समय पर प्रदर्शन नहीं कर रहा है; हमें बस "सभी कॉल को एक कॉल में कॉल करके X में प्रदर्शन को ठीक करने" की आवश्यकता है।
ashes999

जवाबों:


25

लेकिन क्या यह वास्तव में महत्वपूर्ण है? विचार करें कि यूआई को एपीआई के लिए एक नेटवर्क कॉल करना है; यह बहुत बड़ा है (मिलीसेकंड के परिमाण का क्रम)। डेटाबेस को चीजों को स्मृति में रखने के लिए अनुकूलित किया जाता है और बहुत तेजी से रीड को निष्पादित करता है, (उदाहरण के लिए। SQL सर्वर लोड करता है और रैम में सब कुछ रखता है और अगर यह कर सकता है तो आपके सभी मुफ्त रैम का लगभग उपभोग करता है)।

तर्क

सिद्धांत रूप में, आप सही हैं। हालांकि, इस तर्क के साथ कुछ खामियां हैं:

  1. आपने जो बताया, उससे यह स्पष्ट नहीं होता है कि आपने वास्तव में अपने ऐप का परीक्षण किया है या नहीं। दूसरे शब्दों में, क्या आप वास्तव में जानते हैं कि ऐप से एपीआई तक नेटवर्क सबसे धीमा घटक है? क्योंकि यह सहज है, यह मानना ​​आसान है कि यह है। हालांकि, प्रदर्शन की चर्चा करते समय, आपको कभी भी अनुमान नहीं लगाना चाहिए। मेरे नियोक्ता में, मैं प्रदर्शन का नेतृत्व कर रहा हूं। जब मैं पहली बार शामिल हुआ, तो लोग सीडीएन, प्रतिकृति, आदि के बारे में अंतर्ज्ञान के आधार पर बात करते रहे कि अड़चन क्या होनी चाहिए। पता चलता है, हमारी सबसे बड़ी प्रदर्शन समस्याएं डेटाबेस क्वेरीज़ का खराब प्रदर्शन कर रही थीं।

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

  3. सोचने का यह तरीका एक बार में एक ही प्रक्रिया को मानता है, या दूसरा तरीका, कोई संगति नहीं है। यह मानता है कि एक अनुरोध दूसरे अनुरोध के प्रदर्शन को प्रभावित नहीं कर सकता है। संसाधनों को साझा किया जाता है, जैसे डिस्क I / O, नेटवर्क बैंडविड्थ, कनेक्शन पूल, मेमोरी, सीपीयू साइकिल, आदि। इसलिए, साझा डेटाबेस के एक डेटाबेस कॉल के उपयोग को कम करने से इसे अन्य अनुरोधों को धीमा करने से रोका जा सकता है। जब मैं पहली बार अपने वर्तमान नियोक्ता से जुड़ा, तो प्रबंधन का मानना ​​था कि 3 सेकंड डेटाबेस क्वेरी को ट्यून करना समय की बर्बादी है। 3 सेकंड इतना कम है, इस पर समय क्यों बर्बाद करें? क्या हम सीडीएन या कम्प्रेशन या कुछ और के साथ बेहतर नहीं होंगे? लेकिन अगर मैं 1 सेकंड में 3 सेकंड का क्वेरी रन बना सकता हूं, तो एक इंडेक्स जोड़कर कह सकते हैं, कि 2/3 कम अवरुद्ध है, 2/3 कम समय एक थ्रेड पर कब्जा करने में बिताया है, और अधिक महत्वपूर्ण बात, डिस्क से पढ़ा गया कम डेटा।

सिद्धांत

एक आम धारणा है कि सॉफ्टवेयर प्रदर्शन बस गति के बारे में है ।

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

हालांकि, ऊपर दिए गए, मुझे आशा है कि आप देख सकते हैं कि संसाधन विवाद, अनुक्रमण की कमी, खराब लिखित कोड आदि, प्रदर्शन में आश्चर्यजनक अंतर पैदा कर सकते हैं।

अनुमान

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

जहां यह मुरकी हो जाती है

यह पूरा सवाल "एकाधिक" बनाम "एकल" डेटाबेस कॉल के बारे में है। लेकिन यह स्पष्ट नहीं है कि कितने एकाधिक हैं। जैसा कि मैंने ऊपर कहा था, अंगूठे के एक सामान्य नियम के कारण, मैं आवश्यकतानुसार कुछ डेटाबेस कॉल करने की सलाह देता हूं। लेकिन वह केवल अंगूठे का एक नियम है।

यहाँ क्यों है:

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

टी एल; डॉ

TLDR: जब हम पहले से ही LAN पर नेटवर्क कॉल कर रहे हों, तो क्या कई डेटाबेस कॉल्स की चिंता करना बहुत महत्वपूर्ण है? यदि हां, तो क्यों?

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


3

आपकी टीम की तरह लगता है कि इससे पहले कि वे एक कारण है अनुकूलन कर रहा है। क्या आपने इन अनुरोधों को निष्पादित करने के लिए समय मापा है? संभावनाएं हैं कि यह प्रतिमान अंतिम उपयोगकर्ता के लिए खराब प्रदर्शन पैदा करेगा क्योंकि वेब सर्वर पर दौर यात्राएं वेब सर्वर से डेटाबेस तक कनेक्शन समय की तुलना में बहुत अधिक विलंबता होगी। उस सबसे ऊपर वेब ब्राउज़र केवल एक वेब सर्वर से 2 समवर्ती कनेक्शन बना देगा, इसलिए जटिल पृष्ठों के लिए आप संभवतः एक अड़चन में चले जाएंगे।

किसी भी तरह से ऑप्टिमाइज़ेशन के फैसले बिना डेटा के किए नहीं जाना चाहिए। इसे मापें और जानें कि आपके आवेदन के लिए सबसे अच्छा क्या है।


1
यह हमारे खराब प्रदर्शन प्रथाओं के बारे में एक अच्छी टिप्पणी है, लेकिन मेरे सवाल का जवाब नहीं देता है कि क्या DB कॉल के बारे में चिंता करने के लिए कुछ है जब मेरे पास पहले से ही नेटवर्क कॉल है।
ashes999

1
सामान्य तौर पर, मैंने पाया है कि समस्या नहीं होने के लिए कई डेटाबेस कॉल किए जा रहे हैं। यह ज्यादातर कनेक्शन पूलिंग और DB और वेब सर्वर के बीच छोटे विलंबता के कारण होता है। एक बिंदु है जहां विभिन्न डीबी कॉल का एक गुच्छा प्रदर्शन को नकारात्मक रूप से प्रभावित करेगा, लेकिन मेरे पास आपके लिए एक कठिन संख्या नहीं है। यह सभी पर्यावरण और अनुप्रयोग पर निर्भर है। केवल मापने से आपको वह उत्तर मिलेगा जो आप चाहते हैं।
brianfeucht

यह (जरूरी) विशिष्टताओं पर निर्भर नहीं होना चाहिए, क्योंकि मैं परिमाण के आदेश के बारे में बात कर रहा हूं।
ashes999

बस मोटे अनुमान (आपको मापने की आवश्यकता है): वेब सर्वर से DB से जुड़ने का औसत समय: ग्राहक से वेब सर्वर से जुड़ने के लिए औसत समय: 20ms तो उन संख्याओं को मानकर जिन्हें मैंने बेतरतीब ढंग से हवा से बाहर निकाला है, आप 10 सही कर सकते हैं। एक वेब सेवा कॉल करने में लगने वाले समय में डेटाबेस कॉल। यह मानते हुए कि डेटाबेस क्वेरी में समान समय लगता है। पर्यावरण पर अत्यधिक निर्भर उन नंबरों पर। यदि वेब सेवा कॉल करने वाला ग्राहक स्थानीय है, तो वह परिमाण के कई आदेशों तक छोड़ सकता है।
ब्रायनफ्यूच

2

हम आपको नहीं बता सकते।

हम आपके प्रश्नों को नहीं देखते हैं। हम नहीं जानते कि उन्हें पूरा होने में कितना समय लगता है। हमें नहीं पता कि आपके API सर्वर के प्रत्येक अनुरोध में ओवरहेड कितना शामिल है। हम नहीं जानते कि भौगोलिक रूप से आपके ग्राहक कितने बिखरे हुए हैं। आदि।

यदि यह एक ऐसा परिदृश्य है जिसमें अनुकूलन की आवश्यकता होती है और वह एक है जिसमें आप यह तय कर सकते हैं कि कॉल को एक साथ विभाजित करना या उसमें शामिल होना है, तो आपको इसे दोनों तरीकों से बेंचमार्क करने की आवश्यकता है : यह तय करें कि आप किस चीज के लिए अनुकूलन कर रहे हैं (UI विलंबता, सर्वर सीपीयू लोड, विवाद, आदि) और एक को चुनें जो आपके अनुकूलन लक्ष्य को बेहतर ढंग से प्राप्त करता है।


इसके अलावा, केवल एक चीज जिसे मैं निश्चितता के साथ जोड़ सकता हूं वह यह है:

एक अनुरोध के भीतर, आपको उन सभी प्रश्नों को करना चाहिए जो आपको प्रतिक्रिया बनाने के लिए करने की आवश्यकता है।

दूसरे शब्दों में, यदि प्रतिक्रिया तब तक उत्पन्न नहीं की जा सकती है जब तक कि सभी एन प्रश्नों का प्रदर्शन नहीं किया जाता है, तो आमतौर पर उन्हें अलग करना बेहूदा है। यदि आप सार्थक परिणाम उत्पन्न कर सकते हैं, चाहे मध्यवर्ती हो या पूरा, प्रत्येक प्रश्न के बाद, बेंचमार्किंग शुरू करें।


1

दो विचार:

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

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

कोड के सरल संगठन से, मैं सहमत हूं कि प्रत्येक एपीआई कॉल को संभवतः एकल संग्रहित प्रक्रिया (या डीबी फ़ंक्शन) को कॉल करना चाहिए जो बदले में अनुरोध को भरने के लिए जिम्मेदार है। प्रक्रिया में एक से अधिक चरण हो सकते हैं।


मैं आपके साथ प्रदर्शन को मापने के बारे में सहमत हूं, जो कोई भी ऐसा नहीं करता है। इस बात का कोई प्रमाण नहीं है कि यह तेज़ है, लेकिन यह अभी भी जारी है। प्रदर्शन एक समस्या के रूप में आता है जब हमारे पास कुछ कॉल होते हैं जो कह सकते हैं, 1000 DB है SELECT
राख

@ ashes999 जब आप db कॉल्स की संख्या को देखते हुए गति प्राप्त कर सकते हैं, तो यह इंडेक्सिंग स्ट्रैटेजी आदि में पाया जाता है, न कि कॉल्स की संख्या। जैसा कि सभी ने संकेत दिया है, प्रदर्शन डेटा को देखें।
रिचर्ड

रिचर्ड, मैं सहमत हूं, और मैं वास्तव में यह जानता हूं। मेरा सवाल यह है कि जब विभिन्न नेटवर्क कॉल शामिल होते हैं, तो विभिन्न लोग इस बिंदु को लाते रहते हैं कि "कई DB कॉल धीमी हैं"। मैं वास्तव में नहीं देखता कि यह कैसे महत्वपूर्ण हो सकता है।
ashes999

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

1

यदि डेटाबेस आपकी REST सेवा से भिन्न सर्वर पर है, तो प्रत्येक डेटाबेस कॉल का परिणाम नेटवर्क राउंडट्रिप में होगा और इससे प्रदर्शन को काफी नुकसान पहुंच सकता है :

मैंने एक बार लगभग 500 डेटाबेस प्रश्नों के लिए एक सिंगल वेबसर्विस कॉल का अनुवाद किया था - जब वेबबेस और डेटाबेस दोनों एक ही मशीन पर स्थित होते हैं, तो यह एक समस्या थी, लेकिन जब वे अलग-अलग होते थे, तो 6-7 सेकंड के प्रतिक्रिया समय में बदल जाते थे। मशीनों।

जाहिर है, डेटाबेस के लिए 500 चक्कर बहुत चरम है। मुझे यकीन नहीं है कि आपके प्रदर्शन की आवश्यकताएं क्या हैं, लेकिन एक नियम-अंगूठे के रूप में, मैं कहूंगा कि यदि आप लगभग 10 डेटाबेस प्रश्नों प्रति REST- कॉल के तहत रहते हैं, तो आपको एक महत्वपूर्ण प्रदर्शन हिट का अनुभव नहीं करना चाहिए।


1

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

इसलिए, यद्यपि आपके सिस्टम के वर्तमान कॉन्फ़िगरेशन में बीता समय का अधिकांश हिस्सा REST API कॉल के साथ लिया गया है, DB स्तर पर प्रदर्शन की अनदेखी भविष्य के लिए समस्याएं खड़ी कर रही है।


0

प्रस्तुत अनुकूलन मार्ग केवल चीजों को देखने का गलत तरीका है।

एपीआई कॉल परमाणु होना चाहिए। दूसरे शब्दों में, मुझे जो एक्शन चाहिए, उसे करने के लिए मुझे 1 वेब एपीआई कॉल करने में सक्षम होना चाहिए। चाहे वह डेटा प्राप्त करना हो, रिकॉर्ड अपडेट करना हो या जो भी हो। यह कार्रवाई का कारण बनने के लिए 1 से अधिक कॉल नहीं लेना चाहिए। और कई कॉल के दौरान लेनदेन का लाभ उठाने का प्रयास प्लेग की तरह किया जाना चाहिए।

कभी-कभी एक क्रिया बल्कि जटिल होती है। उदाहरण के लिए, डेटा प्राप्त करना जो कई स्रोतों से संयुक्त है: फिर से, यह एक एकल कॉल होना चाहिए। या तो पूरी चीज काम करती है या पूरी चीज विफल हो जाती है।

अब, यह कहना कि एक सिंगल एपीआई कॉल केवल एक डीबी क्वेरी को निष्पादित करना चाहिए एक सा नैतिक है। जैसा कि आपने बताया है, नेटवर्क पर कॉल को मार्शेल करने के लिए ओवरहेड अक्सर समग्र समय के संदर्भ में अधिक महंगा होने के आदेश है।

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

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

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