क्या तेज है? REST API का उपयोग करना या किसी डेटाबेस को सीधे क्वेरी करना?


16

तेजी से प्रदर्शन बुद्धिमान है? REST API बनाना और आपका वेब ऐप आपके डेटाबेस से सभी इंटरैक्शन करने के लिए REST API का उपयोग करना या सीधे अपने डेटाबेस को क्वेरी करना (यानी जावा के लिए JDBC जैसे डेटाबेस को क्वेरी करने के लिए आपकी भाषा जो भी विशिष्ट वस्तु का उपयोग करती है)?

जिस तरह से मैं इसे REST के साथ देखता हूं:

  1. REST पद्धति को कॉल करने के लिए आप अपने कोड में कोई ऑब्जेक्ट बनाते हैं
  2. Http विधि को कॉल करें
  3. आपके REST API के अंदर कोड डेटाबेस पर सवाल उठाता है
  4. डेटाबेस कुछ डेटा देता है
  5. REST API कोड डेटा को Json में पैक करता है और आपके क्लाइंट को भेजता है
  6. क्लाइंट को Json / XML प्रतिक्रिया मिलती है
  7. अपने कोड में किसी ऑब्जेक्ट के लिए मानचित्र प्रतिक्रिया

दूसरी ओर, डेटाबेस को सीधे क्वेरी करना:

  1. आप डेटाबेस क्वेरी करने के लिए क्वेरी स्ट्रिंग के साथ एक ऑब्जेक्ट बनाते हैं
  2. डेटाबेस कुछ डेटा देता है
  3. अपने कोड में किसी ऑब्जेक्ट के लिए मानचित्र प्रतिक्रिया

तो क्या इसका मतलब यह नहीं होगा कि REST API का उपयोग करना धीमा होगा? शायद यह डेटाबेस के प्रकार (SQL बनाम NoSQL) पर निर्भर करता है?


3
REST API एक डेटाबेस एक्सेस प्रोटोकॉल नहीं है, इसलिए प्रश्न श्रेणी त्रुटि का एक बड़ा हिस्सा है। REST एपी एक डॉक्यूमेंट स्टोर है। यह एक सर्वर साइड पर डेटाबेस का उपयोग करता है (या यह नहीं हो सकता है)। यदि आपको REST API की कोई आवश्यकता नहीं है, तो स्पष्ट रूप से एक का उपयोग न करें। लेकिन फिर वह सब कुछ हो जाता है। यदि आपको डेटाबेस की आवश्यकता नहीं है, तो किसी एक का उपयोग न करें, फ़ाइल सिस्टम पर लिखना डेटाबेस से अधिक तेज़ होगा। यदि आपको किसी फ़ाइल सिस्टम की आवश्यकता नहीं है, तो एक का उपयोग न करें, रैम को लिखना डिस्क से तेज है। यदि आपको RAM की आवश्यकता नहीं है, तो इसका उपयोग सीपीयू कैश के लिए तेजी आदि आदि से किया जा रहा है
Cormac Mulhall

1
"दूसरी ओर" आपको अपने डेटाबेस को बड़ी खराब दुनिया में उजागर करने की आवश्यकता है।
पीटर बी

@PieterB: नहीं, "दूसरी ओर" डेटाबेस को वेब ऐप पर उजागर कर रहा है जो विश्वसनीय है।
जैक्सबी

@JacquesB और वेब ऐप क्लाइंट कंप्यूटर पर चलता है। इसलिए इस पर भरोसा नहीं करना चाहिए क्योंकि यह एक संशोधित संस्करण हो सकता है।
पीटर बी

@PieterB: यह सवाल एक अविश्वसनीय सर्वर पर चलने वाले वेब ऐप के बारे में कुछ भी नहीं बताता है। यह एक बहुत ही असामान्य सेटअप होगा।
जैक्सबी

जवाबों:


18

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

डेटाबेस का सार अच्छा अभ्यास है। यदि आप गति के बारे में चिंतित हैं तो आप डेटा को मेमोरी में कैशिंग कर सकते हैं ताकि अनुरोध को संभालने के लिए डेटाबेस को छूने की आवश्यकता न हो।

प्रदर्शन का अनुकूलन करने से पहले, हालांकि मैं इस बात पर ध्यान दूंगा कि आप किस समस्या को हल करने की कोशिश कर रहे हैं और जिस वास्तुकला का आप उपयोग कर रहे हैं, मैं ऐसी स्थिति के बारे में सोच रहा हूं जहां डेटाबेस विकल्प प्रत्यक्ष पहुंच बनाम होगा।


कैशिंग का उल्लेख करने के लिए +1। हालांकि यह कर रहा है extra work। लेकिन वास्तव में यह दोहराया क्वेरी को कैशिंग द्वारा तेज हो सकता है।
याना अगुन सिसवंतो

3
@Klee आपका उत्तर बिल्कुल सही नहीं है। यदि आवश्यक नहीं है तो एक REST सेवा का परिचय करना धीमा कर देगा क्योंकि सिस्टम अधिक कर रहा है। «हर मामले में समापन बिंदु पर ट्रैफ़िक नहीं है, यदि उदाहरण के लिए एक रिवर्स-प्रॉक्सी cahced परिणामों को संभाल सकता है।
थॉमस जंक

@klee मैंने जो कारण पूछा, वह इस SO पोस्ट प्रोग्रामर से था ।stackexchange.com/questions/277701/… - एक उत्तर इस बारे में बात करता है कि अमेज़ॅन को प्रत्यक्ष पहुंच के बजाय पूरी तरह से Restful प्रणाली का उपयोग करके कैसे बड़ी सफलता मिली। बस मुझे सोच रहा था ...
माइक्रो

9

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

गौर करें कि क्या आपकी प्राथमिक चिंता इंटरऑपरेबिलिटी (मोबाइल, वेब, बी 2 बी) है, अब आरईएसटी बहुत आकर्षक है क्योंकि यह प्रौद्योगिकी अज्ञेयवादी है।

मान लीजिए आप एक डेटाबेस के लिए कोड। यदि आप अपने अंतर्निहित डेटा स्टोर को बदलने के लिए चुनते हैं तो आप क्या करेंगे। यदि आप अंतर्निहित स्टोर पर कसकर युग्मित हैं, तो यह करना कितना मुश्किल होगा?

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


6

यदि इस प्रश्न का उत्तर देना कठिन है।

सही सामान्य उत्तर होना चाहिए: यह निर्भर करता है।

जिस तरह से मैं इसे REST के साथ देखता हूं:

  1. REST पद्धति को कॉल करने के लिए आप अपने कोड में कोई ऑब्जेक्ट बनाते हैं
  2. Http विधि को कॉल करें
  3. आपके REST API के अंदर कोड डेटाबेस पर सवाल उठाता है
  4. डेटाबेस कुछ डेटा देता है
  5. REST API कोड डेटा को Json में पैक करता है और आपके क्लाइंट को भेजता है
  6. क्लाइंट को Json / XML प्रतिक्रिया मिलती है
  7. अपने कोड में किसी ऑब्जेक्ट के लिए मानचित्र प्रतिक्रिया

आपकी सोच में गलती है।

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

Insofar @Klees का उत्तर बहुत सही नहीं है :

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

जब कछुओं के परिणामों से निपटते हैं, तो आपके आवेदन पर कोई प्रभाव नहीं पड़ता है: ज्ञात प्रश्नों के उत्तर देने को रिवर्स-प्रॉक्सी के माध्यम से किया जा सकता है।


4
यदि डेटा बाकी सेवा परत में उपलब्ध नहीं है, तो यह वेब ऐप में उपलब्ध है, जो प्रदर्शन के लिए बेहतर होगा।
जाकबीस

सबसे तेज़ तरीका है, वेब ऐप को बिलकुल भी ना मारना।
थॉमस जंक

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

@ThomasJunk: यदि मैं मूल प्रश्न को सही समझता हूं, तो क्लाइंट एक वेब ऐप है, और सवाल यह है कि वेब ऐप को सीधे db से कनेक्ट करना चाहिए या किसी बाकी सेवा के माध्यम से कॉल करना चाहिए।
जैक्सबी

1
यह मेरे जवाब पर कुछ भी नहीं बदलता है। REST- सेवा को कॉल करने में एक वेब-सर्वर को कॉल करना शामिल है, जो एक रिवर्स प्रॉक्सी के पीछे हो सकता है, जहां संभव उत्तरों को कैश किया जा सकता है - जैसा कि मैंने पहले ही कहा था।
थॉमस जंक

2

एक अतिरिक्त सेवा स्तरीय का परिचय देने से हमेशा जटिलता और प्रदर्शन में वृद्धि होती है। कुछ विशिष्ट प्रकार के आर्किटेक्चर हैं, जहां साझा कैशिंग के कारण एक साझा सेवा स्तरीय (जैसे REST API) को लागू करने में सुधार हो सकता है - लेकिन ऐसा लगता है कि यह आपके पास वास्तुकला का प्रकार नहीं है।

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

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


1

निर्भर करता है।

जाहिर है, आपके कोड में जितनी ज्यादा परतें उतनी धीमी होती जाती हैं। लेकिन ... वहाँ एक बिंदु आता है जहां प्रत्यक्ष अंत-टू-एंड प्रदर्शन मापनीयता के रूप में ज्यादा मायने नहीं रखता है। यदि आपके पास स्थानीय पीसी पर 1 उपयोगकर्ता अपने डेटाबेस तक पहुंच रहा है, तो यह तेजी से जा सकता है। यदि आपके पास एक हजार उपयोगकर्ता एक ही DB को एक ही पीसी पर एक्सेस कर रहे हैं, तो संभावना है कि आप उन सभी को निराश होते हुए देखेंगे। इसका उपाय DB को दूसरे बॉक्स में ले जाना है, बीच में एक परत जोड़ना है और हालांकि 1 उपयोगकर्ता के लिए, यह धीमी गति से प्रदर्शन करेगा, जब हजार इसे एक्सेस करेंगे, तो यह तेजी से आगे बढ़ेगा। (यह एक सरलीकृत उत्तर है, लेकिन सिद्धांत रूप में सच है)।

आपके डीबी को एक मध्य स्तरीय परत के पीछे छिपाने के अन्य कारण हैं, जैसे सुरक्षा।


-2

मुझे नहीं पता कि आप कहाँ खो जाते हैं, लेकिन यह बहुत स्पष्ट है, जब आप REST एपीआई का उपयोग कर रहे हैं, तो आप अतिरिक्त कदम उठा रहे हैं, और अतिरिक्त कदम "हमेशा" का अर्थ है जब प्रोग्रामिंग शामिल हो।

वहाँ पेशेवरों और विपक्ष है, लेकिन अगर आप अपने आवेदन से सीधे डेटाबेस का उपयोग कर सकते हैं तो वेब API का उपयोग करने के बजाय इसे सीधे सीधे कॉल करना बेहतर होगा, यदि आप वेब एपीआई का उपयोग करते हैं तो आप आसानी से अपने एप्लिकेशन को अलग-अलग प्लेटफ़ॉर्म पर पोर्ट कर सकते हैं।


1
»मुझे नहीं पता कि आप कहां खो गए हैं, लेकिन यह बहुत स्पष्ट है, जब आप REST API का उपयोग कर रहे हैं, तो आप अतिरिक्त कदम उठा रहे हैं, और अतिरिक्त कदम" हमेशा "का अर्थ है जब प्रोग्रामिंग शामिल हो।" यदि इसका मतलब है कि निष्पादन में धीमी है। यह सही नहीं है।
थॉमस जंक

1
क्या ऐसी स्थितियाँ नहीं हैं जहाँ डेटाबेस को एक्सेस करना केवल पोर्टेबिलिटी से अलग एक बुरा विचार है? कभी-कभी REST API आदि होने से सर्वर की तरफ अधिक तर्क (और बेहतर सुरक्षा?) रख सकते हैं, है ना?
जे ट्राना

@JTrana जो कि हाँ या नहीं हो सकती है, वास्तव में इस बात पर निर्भर करती है कि आप कैसे काम करते हैं, जबकि अतिरिक्त परत को शुरू करने से सुरक्षा की अतिरिक्त परत प्रदान की जा सकती है, अतिरिक्त परत को जोड़ने का मतलब यह भी है कि आपके पास कुछ को खराब करने और सुरक्षा छेद को उजागर करने का अधिक मौका है। मुझे लगता है कि वेब एपीआई का बिंदु आपके "एपीआई" को उजागर करना है। फेसबुक, अमेज़ॅन, Google जैसे बड़े एप्लिकेशन को 3 जी पार्टी तक पहुंच प्रदान करने की आवश्यकता है और बहुत सारे प्लेटफ़ॉर्म होने चाहिए, जिनके पास वेब एपीआई होना चाहिए, लेकिन छोटे अनुप्रयोग के लिए आपको इसे करने से पहले दो बार सोचना होगा।
किरी

-2

आराम :

  • मल्टी फ्रंट और 1 बैकएंड के लिए खुला है
  • अपना स्वयं का एपीआई बनाने की जरूरत है (या लूपबैक की तरह एक का उपयोग करें)
  • ऑफ़लाइन काम नहीं कर रहा है

स्थानीय DB:

  • 'टियर्स' के लिए नहीं खोला, उन्हें सिंक्रनाइज़ करने के लिए आपके बैकएंड तक पहुंच की आवश्यकता है
  • कोई API बनाने की आवश्यकता नहीं है, DB इंटरफ़ेस का उपयोग करें
  • ऑफ़लाइन काम कर रहा है

यह बहुत बड़ा प्रसार है, लोगों के सामने इन लोगों को भूल जाते हैं


2
-1। जबकि एपीआई बनाने के लिए कोई "आवश्यकता" नहीं है, डीएएल नहीं बनाने से अक्सर भारी दर्द होता है डेटाबेस में बदलाव की आवश्यकता होनी चाहिए। इसके अलावा कोई कारण नहीं कि अगर आपके पास DB "ऑफलाइन" है कि बाकी सेवा भी वहां उपलब्ध नहीं कराई जा सकती है।
जेम्स स्नेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.