कई अतुल्यकालिक कॉल बनाम एकल कॉल एपीआई के लिए


12

हम एक REST API विकसित कर रहे हैं, जो दूसरों के बीच जावास्क्रिप्ट के माध्यम से HTML5 फ्रंटेंड द्वारा खपत की जा रही है। आवेदन संगठन के भीतर उपयोग करने के लिए है और आमतौर पर इसके लगभग 300 उपयोगकर्ता हैं, लेकिन हम 1000 या अधिक उपयोगकर्ताओं को अच्छी तरह से स्केल करना चाहते हैं।

आम तौर पर एपीआई के कनेक्शन लैन के भीतर किए जाएंगे इसलिए कनेक्शन की गुणवत्ता और विलंबता अच्छी होगी, हालांकि यह इंटरनेट पर कभी-कभार उपयोग को बाहर नहीं किया गया है जहां कनेक्शन धीमा हो सकता है और 3 जी / 4 जी के माध्यम से अधिक अंतराल के साथ हो सकता है।

हमने सोचा कि दो विकल्प हैं:

  1. सीमांत इंटरफ़ेस के विभिन्न घटकों को लोड करने के लिए एपीआई में कई एक साथ अतुल्यकालिक कॉल करेगा।

    • पेशेवरों: सादगी।
    • विपक्ष: सर्वर से अधिक कनेक्शन।
  2. फ्रंटएंड का कंट्रोलर एपीआई को सिंगल कॉल करेगा, जो पैरामीटर के रूप में ऑब्जेक्ट को लाने की जरूरत है।

    • पेशेवरों: सर्वर से केवल एक कनेक्शन, हालांकि सर्वर डेटाबेस से कई कनेक्शन करेगा।
    • विपक्ष: दोनों दृश्य और एपीआई में तंत्र की आवश्यकता है। यह डिजाइन को जटिल बनाता है।

इसके अतिरिक्त स्पष्टीकरण: विभिन्न संसाधन होंगे ... / उत्पाद ... / स्थान आदि इन संसाधनों को अकेले लाया जा सकता है, लेकिन एक अन्य अमूर्त संसाधन होगा ... / स्क्रीन? उत्पाद और स्थान जो एक कॉल में दोनों प्राप्त करेंगे।

जवाबों:


14

विकल्प 1 (एकाधिक एसिक्स कॉल) सबसे अच्छा विकल्प है क्योंकि:

  1. प्रत्येक व्यक्तिगत कॉल की अपनी इकाई होती है , इसलिए यदि कुछ विफल होता है तो आप व्यक्तिगत रूप से पुनः प्रयास कर सकते हैं। मोनोलिथिक 'वन-कॉल' आर्किटेक्चर में, यदि एक चीज विफल हो जाती है तो आपको पूरी कॉल फिर से करनी होगी
  2. सर्वर साइड कोड सरल होगा: फिर से, प्रतिरूपकता , जिसका अर्थ है कि विभिन्न डेवलपर्स विभिन्न एपीआई संसाधनों पर काम कर सकते हैं
  3. एक सामान्य एमवीसी पैटर्न में एक एपीआई कॉल लोड कई अलग-अलग संसाधनों के होने का कोई मतलब नहीं है ; उदाहरण के लिए, यदि आप /productsकिसी पृष्ठ पर दिखाने के लिए उत्पादों की एक सूची प्राप्त करने का अनुरोध करते हैं , और आप उन स्थानों की सूची भी प्रदर्शित करना चाहते हैं जहाँ लोकप्रिय उत्पाद बेचे जाते हैं, तो आपके पास दो अलग-अलग संसाधन हैं: Productऔर Location। यद्यपि वे एक ही पृष्ठ पर प्रदर्शित होते हैं, आप तार्किक रूप से कॉल नहीं कर सकते हैं /productsऔर इसके साथ ही स्थान भी लौटा सकते हैं
  4. मॉड्यूलर लॉग में आपकी लॉगिंग / उपयोग रिपोर्ट सरल होगी। यदि आप अनुरोध करते हैं /productsऔर आप स्थानों को लोड भी कर रहे हैं, तो आपकी लॉग फाइलें वास्तव में भ्रमित करने वाली हैं
  5. यदि आपको किसी विशेष संसाधन के साथ कोई समस्या है, तो एक-कॉल अप्रोच पूरे पृष्ठ को तोड़ देगा और यह आपके उपयोगकर्ताओं के लिए स्पष्ट नहीं होगा कि क्या टूट गया - और इसका मतलब है कि आपकी टीम को समस्या को ठीक करने में अधिक समय लगेगा; हालांकि, मॉड्यूलर दृष्टिकोण में अगर एक चीज टूट जाती है, तो यह बहुत स्पष्ट हो जाएगा कि क्या टूट गया और आप इसे तेजी से ठीक कर सकते हैं। यह पेज के बाकी हिस्सों को भी बर्बाद नहीं करेगा (जब तक कि चीजें बहुत बारीकी से युग्मित न हों ...)
  6. यदि चीजें अलग हो जाएं तो सामान्य रूप से परिवर्तन करना आसान होगा; अगर आपके पास एक एपीआई कॉल द्वारा 5 संसाधन लोड किए जा रहे हैं, तो यह पता लगाना कठिन होगा कि जब आप कुछ बदलना चाहते हैं तो चीजों को कैसे न तोड़ें?

संपूर्ण बिंदु यह है कि संसाधन अलग-अलग हैं, और REST API में एक ही API पथ से कई अलग-अलग संसाधनों को वापस करने का कोई मतलब नहीं है, भले ही आप "सर्वर से कनेक्शन सहेज रहे हों"। वैसे, सशर्त रूप से लोड (अलग) संसाधनों के मापदंडों का उपयोग करना Restful नहीं है।

सभी ने कहा, एकमात्र तार्किक विकल्प अलग-अलग संसाधनों के लिए कई एसिंक्रियन अनुरोध करना है: मॉड्यूलर दृष्टिकोण लें !

पुनश्च - समय से पहले "सर्वर से कनेक्शन" का अनुकूलन न करें, खासकर जब HTTP कनेक्शन अविश्वसनीय रूप से कम ओवरहेड होते हैं और आप एक लैन पर होते हैं। इस तरह की सोच बल्ले से सरल डिजाइन चुनने के बजाय आपको बाद में परेशानी में डालने वाली है।


1
इसके अलावा, मॉड्यूलर परीक्षण इकाई के लिए आसान है।
user949300

@ user949300 अच्छा बिंदु, मैंने ऐसा सोचा भी नहीं था! यूनिट परीक्षण वास्तव में बहुत आसान होगा अगर चीजें डिकम्पोज की जाती हैं।
क्रिस क्रेफ़िस

त्वरित और विस्तारित प्रतिक्रिया के लिए धन्यवाद। मैं सभी से सहमत हूं, लेकिन मुझे लगता है कि मैंने इसे ठीक नहीं बताया। विभिन्न संसाधन / उत्पाद / स्थान होंगे। इन संसाधनों को अकेले प्राप्त किया जा सकता है, लेकिन एक अन्य सार संसाधन / स्क्रीन होगा? उत्पाद और स्थान जो एक कॉल में दोनों प्राप्त करेंगे। वैसे भी मैं सरल तरीका भी पसंद करता हूं।
मैटिंसल्टो

@mattinsalto का दृष्टिकोण /screen?Product&Locationsएक बुरा दृष्टिकोण है, कम से कम सभी अनुभव के साथ मेरे पास REST API और एक वेब ऐप विकसित हो रहा है जो उनका उपयोग करता है। एक शुद्ध अखंड दृष्टिकोण से (उदाहरण के लिए रूबी ऑन रेल्स), /screenदोनों को लोड करने वाला मार्ग Productऔर Locationसंसाधन पूरी तरह से ठीक हैं। हालाँकि, REST के दृष्टिकोण से, आप कभी भी एक से अधिक लोड करने का मार्ग नहीं चाहेंगे (जब तक कि आप एक बार में अधिक डेटा प्राप्त करने के लिए तालिकाओं को शामिल नहीं कर रहे हैं)। क्या /screenकरना चाहिए एक मूल लेआउट पृष्ठ लोड होता है और आप डेटा प्राप्त करने के लिए अपने एपीआई को AJAX करते हैं ( Productऔर Location, आदि)।
क्रिस क्रेफ़िस

@mattinsalto यदि आप किसी वेब ऐप (साथ ही अन्य चीजों) में उपयोग करने के लिए REST API विकसित कर रहे हैं, तो आपको केवल डेटा पर ध्यान केंद्रित करने की आवश्यकता है , और इस बात पर कम कि आपके ऐप डेटा का उपयोग कैसे करने जा रहे हैं। REST API को प्रत्येक संसाधन के लिए बुनियादी संचालन (जैसा कि आपको उनकी आवश्यकता है) का समर्थन करना चाहिए। फिर, आपका वेब ऐप किसी भी दिए गए पृष्ठ के लिए आवश्यक सभी संसाधनों (जैसे /screenAJAX के HTTP GETलिए /products/popularऔर /locations) का लोडिंग करेगा । आपका API एक से अधिक लोड करने वाला नहीं होना चाहिए, क्योंकि यह संभव नहीं है कि आप उदाहरण के लिए वेब ऐप बनाम एंड्रॉइड में डेटा प्रदर्शित करेंगे।
क्रिस क्रेफ़िस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.