क्या प्रदर्शन ही एकमात्र कारण है जो पूरी तरह से पारंपरिक REST API के बदले में सिग्नल (Websockets) का उपयोग नहीं करता है?


42

मैंने SignalRअपनी कई परियोजनाओं में रीयल-टाइम मैसेजिंग कार्यक्षमता को प्राप्त करने के लिए उपयोग किया है। यह मज़बूती से काम करने लगता है और इसका उपयोग करना सीखना बहुत आसान है।

प्रलोभन, कम से कम मेरे लिए, एक वेब एपीआई सेवा को विकसित करने और SignalRसब कुछ के लिए उपयोग करना छोड़ देना है ।

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

तो, मैं जानना चाहूंगा:

  1. क्या प्रदर्शन के अलावा सभी वेब सेवाओं के बदले सिग्नलआर का उपयोग नहीं करने का कोई अन्य कारण है?
  2. क्या सिग्नलआर का प्रदर्शन पर्याप्त रूप से इस बात से संबंधित है कि ऐसा करने का कोई मतलब नहीं है?

लंबे समय से मेरा सपना है कि सर्वर साइड ऑब्जेक्ट और सेवा परिभाषाओं का क्लाइंट-साइड सर्विस एक्सेस कोड में अनुवाद करने में सक्षम हो, जैसे बिना कुछ खामोश किए node.js। उदाहरण के लिए, अगर मैं एक दिलचस्प वस्तु को परिभाषित InterestingObjectऔर के लिए एक सेवा CRUDवस्तु InterestingObjectService, मैं सेवा करने के लिए एक मानक यूआरएल मार्ग को परिभाषित कर सकते हैं - जैसे कि, "/ {SERVICENAME} / {methodName}" - लेकिन मैं अभी भी लिखने ग्राहक कोड के लिए उपयोग करने की आवश्यकता है सेवा। चूंकि ऑब्जेक्ट क्लाइंट से सर्वर और बैक में पास होने वाला है, इसलिए कोई व्यावहारिक कारण नहीं हैक्लाइंट-साइड कोड में स्पष्ट रूप से ऑब्जेक्ट को परिभाषित करने के लिए, न ही सीआरयूडी संचालन करने के लिए मार्गों को स्पष्ट रूप से परिभाषित करने की आवश्यकता होनी चाहिए। मुझे ऐसा लगता है कि इस सब को मानकीकृत करने का एक तरीका होना चाहिए ताकि ग्राहक को इस धारणा के तहत लिखना संभव हो कि ग्राहक से सर्वर तक सेवा पहुंच और पारदर्शिता के रूप में वापस काम किया जाए क्योंकि अगर मैं एक WinForms या Java लिख रहा था एप्लेट या नेटिव ऐप या आपके पास क्या है।

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

मेरे संपादन को पढ़ने के बाद मुझे ऐसा लग रहा है कि यह थोड़ा निरर्थक हो सकता है इसलिए कृपया बेझिझक मुझसे पूछें कि क्या आपके पास मेरे बारे में प्रश्न हैं। मूल रूप से, मैं चाहता हूं कि सेवा की पहुंच यथासंभव पारदर्शी हो।


5
यदि आपके पास एक जादुई नेटवर्क कार्ड है जो अनंत संख्या में सॉकेट खोल सकता है और एक जादुई नेटवर्क जो बैंडविड्थ की अनंत मात्रा और एक जादुई सर्वर का समर्थन कर सकता है जिसमें अनंत मात्रा में मेमोरी और सीपीयू चक्र हैं तो वेबसोकेट केवल एक बढ़िया विकल्प है!

Csla वही करता है जो आप चाहते हैं, व्यावसायिक वस्तुएँ क्लाइंट और सर्वर के बीच स्वयं को स्थानांतरित कर सकती हैं।
एंडी

जवाबों:


50

उन दो प्रौद्योगिकियों का एक बहुत अलग उद्देश्य है।

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

  • वेब सॉकेट हर उस चीज के लिए हैं जो चीजों को विपरीत तरीके से करने की जरूरत है। उदाहरण के लिए, जब मैं एक इंट्रानेट वेबसाइट का उपयोग करता हूं जो मुझे वास्तविक समय में लॉग्स और विभिन्न सर्वरों के प्रदर्शन को दिखाता है, तो क्लाइंट निष्क्रिय हो सकता है और तब तक इंतजार कर सकता है जब तक कि सर्वर उसे एक नए प्रकाशित लॉग संदेश या प्रदर्शन मीट्रिक नहीं भेजता।

अंतर स्पष्ट है: पहले मामले में, ग्राहक यह तय करता है कि उसे किसी विशिष्ट जानकारी की आवश्यकता है या नहीं; दूसरे मामले में, ग्राहक बस संपर्क किए जाने की प्रतीक्षा करता है, और यह नहीं पता होगा कि यह कब होगा।

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

लेकिन उनकी विनिमेयता लागत पर आती है:

  • जब आप वेब सॉकेट के बजाय पोलिंग या लॉन्ग पोलिंग का उपयोग करते हैं, तो आप अक्सर बैंडविड्थ बर्बाद कर रहे होते हैं।

  • जब आप वेब एप का उपयोग करने के लिए वेब सॉकेट का उपयोग करते हैं, तो आप खोले गए सभी सक्रिय क्लाइंट से सभी कनेक्शन रखते हैं, जो कि आप वास्तव में नहीं चाहते हैं। एक छोटी सी वेबसाइट के लिए जहां आप एक ही समय में अधिकतम 5 ग्राहकों की अपेक्षा करते हैं, यह कोई समस्या नहीं है। अमेज़न AWS जैसी सेवा के लिए, तकनीकी रूप से इसे हल करना आसान नहीं होगा।

जब आपको उनकी आवश्यकता न हो तो वेब सॉकेट का उपयोग न करें। एक पते के जीपीएस निर्देशांक प्राप्त करने के लिए, मुझे वेब सॉकेट कनेक्शन खोलने, कॉल करने, उत्तर की प्रतीक्षा करने और कनेक्शन को बंद करने में कुछ भी हासिल नहीं होता है: REST ऐसे परिदृश्यों के लिए मेरी जरूरतों को पूरा करता है।

  • यदि आप स्वयं को बार-बार और बार-बार किसी सेवा के लिए REST कॉल के माध्यम से जानकारी के लिए जाँचते हैं, तो यह एक अच्छा संकेत हो सकता है कि आपको वेब पॉकेट में जाना चाहिए। इसी तरह, स्टैक ओवरफ्लो वेब सॉकेट्स का उपयोग करके बैंडविड्थ के उपयोग को कम करता है, क्योंकि यह लोगों को होम पेज पर F5 दबाने में अपना समय व्यतीत करने में मदद नहीं करता है कि क्या उनके पास नए संदेश हैं।

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

इसके अलावा, वेब सॉकेट के पास अभी भी एक सीमित समर्थन है और इसे लागू करना हमेशा आसान नहीं होता है। जबकि सिग्नलआर को लागू करना आसान बनाता है, इसका मतलब यह नहीं है कि आपको इसे अन्य भाषाओं / संदर्भों / वातावरणों में लागू करने में कोई कठिनाई नहीं होगी। REST के साथ, यह आसान है: यह curlहर मुख्यधारा की भाषा में उपलब्ध कॉल या समान सुविधा हो सकती है । वेब सॉकेट के साथ, आप यह सुनिश्चित नहीं कर सकते हैं कि एक क्लाइंट का उपयोग करने में कितना समय लगेगा [उस भाषा का नाम डालें जिसे आप अभी तक यहां नहीं जानते हैं]।

मैंने .NET, पायथन और नोड में कई परियोजनाओं में वेब सॉकेट का उपयोग किया है।

  • .NET में, यह बहुत मुश्किल नहीं था, लेकिन फिर भी, मैंने अभी भी कुछ दिन बिताए हैं कुछ गुप्त समस्याओं का पता लगाने की कोशिश कर रहा है, जैसे कि कनेक्शन को खोलते ही गिरा दिया गया। (यह सिग्नलआर से पहले था; मैंने कभी सिग्नलआरआर की कोशिश नहीं की थी)। मैंने वेब सॉकेट मोड में WCF का भी उपयोग किया, जो या तो मुद्दों के बिना नहीं था (लेकिन मेरा मानना ​​है कि WCF हमेशा मुद्दों के साथ आता है)।

  • नोड.जेएस में, यह उल्लेखनीय था, लेकिन मुझे पुस्तकालयों को दो बार स्विच करना पड़ा जब तक कि मुझे एक काम नहीं मिला। मेरा मानना ​​है कि मैंने वेब सॉकेट्स हैलो वर्ल्ड बनाने की कोशिश में कम से कम एक सप्ताह बिताया है।

  • पायथन में, मैंने एक बार कोशिश की, दो या तीन दिन बिताए और त्याग दिया। इसने कभी काम नहीं किया।

इसकी तुलना REST से करें: केवल एक ही समस्या एक नई भाषा / ढांचे से सामना कर सकती है, यह जानने के लिए कि POST फ़ाइलों को कैसे प्राप्त किया जाए या एक बहुत ही अधिक द्विआधारी प्रतिक्रिया प्राप्त की जाए। मुझे याद है कि कुछ भाषाओं के समाधान की तलाश में कुछ घंटे बिताना। फिर भी, एक विशेष केस के लिए कुछ घंटे साधारण हैलो वर्ल्ड के लिए दिनों या हफ्तों की तुलना में कुछ भी नहीं है।


2
अपने जवाब को बनाए रखा, मेनमा, जैसा कि मैंने इसे दिलचस्प / सहायक पाया। हालांकि मुझे समझ में नहीं आता एक बिंदु है। आप उल्लेख करते हैं कि वेब सॉकेट्स (जैसे एक ही समय में अधिकतम 5) को संभालने के लिए क्लाइंट की एक छोटी संख्या ठीक है। फिर आप उल्लेख करते हैं कि StackOverflow अपने मुखपृष्ठ पर वेब सॉकेट का उपयोग करता है। वे इतनी अधिक संख्या में उपयोगकर्ताओं को कैसे संभालते हैं? मैं पूछता हूं क्योंकि मैं 20+ सिग्नलआर कनेक्शन की कोशिश कर रहा हूं और मुझे लगता है कि संदेश देरी से धीरे-धीरे शुरू होता है, इससे पहले कि पूरी चीज दुर्घटनाग्रस्त हो जाए (सब कुछ अनुत्तरदायी)।
gnychis

1
@gnychis: उस के लिए कई समाधान हैं, लेकिन उनमें से कई स्वयं बुनियादी ढांचे से संबंधित हैं (जो कि serverfault.com के लिए है)। सामान्य तौर पर, अधिक हार्डवेयर फेंकते हैं और उपयोगकर्ताओं को डोमेन के बीच विभाजित करते हैं, ताकि कुछ कनेक्शनों को sockets1.example.com द्वारा संभाला जाए, दूसरों को sockets2.example.com, इत्यादि द्वारा काफी प्रभावी, लेकिन हार्डवेयर और बैंडविड्थ के मामले में काफी महंगा भी।
आर्सेनी मूरज़ेंको

3
यह उत्तर उत्कृष्ट है, लेकिन मैं मूल प्रश्न को संकीर्ण करना चाहूंगा। यदि किसी ऐप को निरंतर वेबसोकेट कनेक्शन की आवश्यकता होती है, तो एक REST API के बदले में पूरी तरह से वेबसोकेट का उपयोग क्यों नहीं किया जाता है? चूंकि एक वेबसोकेट खुला है, शायद इसे पूरी तरह से उपयोग किया जाना चाहिए।
HappyNomad

मुझे बस अपने ही सवाल का जवाब मिल गया।
हैप्पी नोमाड

1

बस मेरे 2 सेंट ...

मुझे लगता है कि यह वास्तव में प्रदर्शन या किसी के बारे में नहीं है। यह मानकों के बारे में है। REST एक मानक है और IMHO के निम्नलिखित फायदे हैं:

  • HTTP अनुरोधों का उपयोग करने के लिए सीधे हैं। हर कोई जल्दी से एक REST API का उपयोग कर सकता है। बिल्ली, आप ब्राउज़र भी खोल सकते हैं और डेटा देखने के लिए एक URL टाइप कर सकते हैं, आप कितने अधिक इंटरएक्टिव हो सकते हैं?
  • (लगभग) कोई भी प्रोग्रामिंग भाषा इसका उपयोग कर सकती है। यह एक सार्वभौमिक इंटरफ़ेस की तरह है। एक विदेशी भाषा से सिग्नलआर के साथ हस्तक्षेप कम स्पष्ट लगता है।
  • इसका अच्छा टूलिंग समर्थन है, जैसे http://petstore.swagger.wordnik.com/
  • यह डिबग करने के लिए एक अच्छा "इंटरफ़ेस" है। आप ब्राउज़र में सीधे आने वाले और बाहर जाने वाले संदेशों को आसानी से देख सकते हैं, डेटा देख सकते हैं, आदि। वेबस्कैट और कस्टम लाइब्रेरी के साथ, यह स्पष्ट नहीं है, आपको स्पष्ट रूप से सब कुछ लॉग करना होगा।

1
जब आप REST API के बारे में कुछ अच्छे बिंदु बनाते हैं तो यह थोड़ा और सीधा होता है और शायद बेहतर टूलींग होने के बावजूद, यह उत्तर कुछ बातों को कहता है जो अभी सच नहीं हैं। REST एक मानक नहीं है , जबकि WebSockets है
स्ट्रिपिंगवर्यर

1
मुझे लगता है कि यह मेरे हिस्से से खराब शब्द था। "मानक" के साथ मेरा मतलब सामान्य है, व्यापक रूप से उपयोग किया जाता है, चीजों को करने का डिफ़ॉल्ट तरीका ... और "आरएफसी मानक" नहीं है।
18'18

अच्छा स्पष्टीकरण। और, btw, क्रोम कम से कम आप अपने देव उपकरणों में WebSockets यातायात को देखने के लिए अनुमति देता है। मैं अन्य ब्राउज़रों की कल्पना भी शायद करता हूं।
स्ट्रिपिंगवर्यर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.