कई छोटे अनुरोध बनाम कुछ बड़े अनुरोध (एपीआई डिजाइन)


49

मैं वर्तमान में एक संगठन के साथ एक परियोजना पर काम कर रहा हूँ:

  • क्लाइंट - REST एपीआई के माध्यम से मुख्य सर्वर से डेटा प्राप्त होता है।
  • सर्वर - तीसरे पक्ष के एपीआई के माध्यम से विभिन्न अन्य सर्वरों से डेटा का अनुरोध
  • तृतीय-पक्ष API - मेरे नियंत्रण से बाहर की सेवाएँ जो सर्वर को डेटा प्रदान करती हैं (Reddit, Hackernews, Quora, आदि)।

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

एक ला कार्टे

इस दृष्टिकोण में, मेरे सर्वर पर 3 अलग-अलग समापन बिंदु होंगे: एक आइटम की सूची प्राप्त करने के लिए, एक आइटम के लिए मुख्य सामग्री प्राप्त करने के लिए, और एक आइटम की प्रतिक्रियाएं प्राप्त करने के लिए।

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

सर्वर-साइड कैश

इस अनुरोध में, मैं अपने सर्वर को सभी स्रोतों के लिए सभी डेटा "लाने" के लिए एक ही कॉल करूंगा। डेटा को सर्वर पर कैश किया जाएगा। क्लाइंट के पास पहले की तरह ही REST एंडपॉइंट्स होंगे, सिवाय इसके कि कॉल के बीच ज्यादा इंतजार नहीं होगा क्योंकि मेरे सर्वर में पहले से ही डेटा है और बस उसे क्लाइंट को फीड करना है।

  • पेशेवरों: ग्राहक पक्ष पर लागू करने के लिए अभी भी आसान है, लेकिन विलंबता मुद्दों के बिना
  • विपक्ष: थोड़ा और अधिक शामिल सर्वर पक्ष, और पहली कॉल वास्तव में बहुत लंबा लग सकता है।

क्लाइंट-साइड कैश

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

  • पेशेवरों: आसान सर्वर कार्यान्वयन, पहली कॉल के बाद बहुत तेजी से
  • विपक्ष: पहला कॉल बहुत धीमा, अधिक जटिल क्लाइंट-साइड कार्यान्वयन होगा

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


यह मुझे ताजगी और गति के बीच एक विकल्प लगता है। आपके हितधारक और अंतिम उपयोगकर्ता क्या पसंद करते हैं?
Erk

जवाबों:


27

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

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

जब हमने पहली बार भारत में डेवलपर्स के साथ चीजें शुरू कीं, तो वे एप्लिकेशन शुरू करने और पेज-दर-पेज नेविगेट करने में काफी इंतजार कर रहे थे। हम यहां दस मिनट प्रतीक्षा समय की बात कर रहे हैं। यह पता चला है कि ऐसा इसलिए था क्योंकि हमारे देव डेटाबेस सर्वर के लिए उनके डेस्क से ~ 200ms पिंग समय कई, कई संक्षिप्त प्रश्नों को डेटाबेस द्वारा गुणा किया जा रहा था। मेरा स्थानीय 0.5ms पिंग इतना तुच्छ था कि वेबसर्वर और डेटाबेस सर्वर के बीच की चैटिंग कभी मायने नहीं रखती थी। यह पहली बार था जब हमने वेबसर्वर और डेटाबेस सर्वर के बीच भौगोलिक अलगाव किया था।

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


2

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


1

केवल आपके द्वारा दी गई जानकारी के आधार पर, विकल्प 1, क्योंकि

  • एक एकल ग्राहक अनुरोध के साथ आप सेब और संतरे मिलाएंगे और फलों की टोकरी बहुत बड़ी हो सकती है।

  • कैशिंग एक ट्रेडऑफ़ है जहां आप प्रदर्शन प्राप्त करते हैं लेकिन संभावित रूप से स्थिरता (बासी डेटा) खो देते हैं । यदि आपके पास कोई पहचाना गया प्रदर्शन समस्याएँ नहीं हैं, तो सिंक्रनाइज़ेशन समस्याएँ आम तौर पर खतरे में डालने लायक नहीं होती हैं।


0

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


0

मैं (लगभग) छूट विकल्प होगा। 1 और 2 के बीच चयन दो बातों पर निर्भर करता है:

  • (ए) एकल, कुल भ्रूण का परिणाम कितना बड़ा है
  • (बी) क्लाइंट / उपयोगकर्ता आमतौर पर उस सत्र में परिणाम का कितना विस्तार करेगा।

यदि A और B चरम सीमा पर हैं तो निर्णय लेना आसान है:

  • यदि A बड़ा है और B छोटा है, तो निश्चित रूप से विकल्प 1 (A la Carte) पर जाएं।
  • यदि A छोटा है और B बड़ा है, तो 2 (सर्वर-साइड कैश) या 3 (क्लाइंट-साइड कैश) पर जाएं।

किसी भी अन्य ए / बी (बड़े / छोटे) रूपों के लिए, आपको विवेक लागू करना होगा। मैं अक्सर विभिन्न ग्राहकों से अलग-अलग उपयोग के मामलों को पूरा करने के लिए मोटे और ठीक समापन दोनों प्रदान करता हूं ।


0

हमेशा की तरह प्रोग्रामिंग में, यह निर्भर करता है।

तो, असली सवाल यह है: ए / बी / सी या तीन के संयोजन के लिए निर्णय लेते समय आपको क्या विचार करना चाहिए?

मैं कहूंगा कि असली भेदभाव करने वाले कारक आपके द्वारा उपभोग किए जा रहे 3 पार्टी एपीआई के कार्यान्वयन विवरण हैं। एक उदाहरण के रूप में, आपको विचार करना चाहिए: क्या वे तेज या धीमे हैं? क्या डेटा बार-बार और अप्रत्याशित रूप से बदलता है? क्या वे "गपशप" या आराम कर रहे हैं?

तेज़, आसान कॉल सेवाओं के मामले में, डेटा को इतनी बार बदलने के साथ कि आपका सर्वर साइड कैश, बासी-कैश की समस्या पैदा करने वाला है, हर तरह से, विकल्प 1 के लिए जाएं: अधिक अनुरोध, कोई कैश, केवल जब जरूरत हो।

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

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

बस मेरा 2 सी।

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