मेरी समझ HTTP पोलिंग, लॉन्ग पोलिंग, एचटीटीपी स्ट्रीमिंग और वेबस्केट्स की


123

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

Http मतदान: मूल रूप से AJAX, XmlHttpRequest का उपयोग करते हुए।

Http लॉन्ग पोलिंग: AJAX लेकिन सर्वर रिस्पॉन्स पर रखता है जब तक कि सर्वर में अपडेट न हो, जैसे ही सर्वर में अपडेट होता है, वह इसे भेजता है और फिर क्लाइंट दूसरा अनुरोध भेज सकता है। नुकसान अतिरिक्त हेडर डेटा है जिसे अतिरिक्त ओवरहेड के कारण आगे और पीछे भेजने की आवश्यकता होती है।

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

जावा एप्लेट, फ्लैश, सिल्वरलाइट: वे tcp / ip पर सॉकेट सर्वर से कनेक्ट करने की क्षमता प्रदान करते हैं, लेकिन चूंकि वे प्लगइन्स हैं, डेवलपर्स उन पर निर्भर नहीं होना चाहते हैं।

WebSockets: वे नए एपीआई हैं जो निम्नलिखित तरीकों से उपरोक्त तरीकों की छोटी कॉमिंग को संबोधित करने की कोशिश करते हैं:

  • Java Applets, Flash या Silverlight जैसे प्लगइन्स पर WebSockets का एकमात्र लाभ यह है कि WebSockets मूल रूप से ब्राउज़र में निर्मित होते हैं और प्लगइन्स पर भरोसा नहीं करते हैं।
  • Http स्ट्रीमिंग पर WebSockets का एकमात्र लाभ यह है कि आपको प्राप्त आंकड़ों को "समझने" और पार्स करने का प्रयास नहीं करना पड़ता है।
  • लंबे मतदान के दौरान WebSockets का एकमात्र लाभ अतिरिक्त हेडर के आकार को समाप्त करना और अनुरोध के लिए सॉकेट कनेक्शन को खोलना और बंद करना है।

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

धन्यवाद!


4
जब आप द्वि-दिशात्मक संचार की आवश्यकता नहीं करते हैं, तो सर्वर-भेजे गए ईवेंट भी देखने लायक होते हैं।
किंवदंती

1
यह वास्तव में उपयोगी प्रश्न है। मुझे लगता है कि यह संभावित रूप से अधिक उपयोगी होगा यदि एक उत्तर था जिसमें कई लेखक योगदान कर सकते हैं।
किंवदंती

@leggetter धन्यवाद फिल, सर्वर भेजा घटनाओं के बारे में टिप के लिए धन्यवाद। मुझे द्वि-दिशात्मक संचार परिदृश्यों के बारे में जानने में दिलचस्पी है। धन्यवाद।
सॉफ्टवेयर गाय

1
HTTP स्ट्रीमिंग और लांग-पोलिंग के साथ आपको द्वि-दिशात्मक संचार के लिए 2 के कनेक्शन की आवश्यकता होती है। सर्वर के लिए एक लंबे समय तक जीवित कनेक्शन -> क्लाइंट 'पुश' संचार और क्लाइंट के लिए एक दूसरा छोटा लाइव कनेक्शन -> सर्वर कॉम्स। इस दूसरे कनेक्शन का उपयोग सेट अप करने और डेटा को सदस्यता बदलने के लिए किया जाता है। तो, EventSource एक द्वि-दिशा समाधान में इस्तेमाल किया जा सकता है और वास्तव में HTTP स्ट्रीमिंग और लांग-पोलिंग से पैदा एक मानकीकृत समाधान है।
लेगगैटर

1
आप भी मेरे द्वारा
Alessandro Alinone

जवाबों:


92

आपके द्वारा पहचाने गए लोगों की तुलना में अधिक अंतर हैं।

द्वैध / दिशात्मक:

  • यूनी-दिशात्मक: HTTP पोल, लॉन्ग पोल, स्ट्रीमिंग।
  • Bi-direcitonal: WebSockets, प्लगइन नेटवर्किंग

बढ़ती विलंबता (लगभग) के क्रम में:

  • WebSockets
  • प्लगइन नेटवर्किंग
  • HTTP स्ट्रीमिंग
  • HTTP लंबे चुनाव
  • HTTP पोलिंग

कोर (क्रॉस-मूल समर्थन):

  • WebSockets: हाँ
  • प्लगइन नेटवर्किंग: पॉलिसी अनुरोध के माध्यम से फ्लैश (दूसरों के बारे में निश्चित नहीं)
  • HTTP * (कुछ हालिया समर्थन)

मूल द्विआधारी डेटा (टाइप किए गए ऐरे, ब्लब्स):

  • WebSockets: हाँ
  • प्लगइन नेटवर्किंग: फ्लैश के साथ नहीं (एक्सटर्नलइंटरफेस पर URL एनकोडिंग की आवश्यकता है)
  • HTTP *: बाइनरी टाइप सपोर्ट को सक्षम करने का हालिया प्रस्ताव

दक्षता कम करने में बैंडविड्थ:

  • प्लगइन नेटवर्किंग: प्रारंभिक पॉलिसी अनुरोध को छोड़कर फ्लैश सॉकेट कच्चे हैं
  • WebSockets: कनेक्शन सेटअप हैंडशेक और फ्रेम प्रति कुछ बाइट्स
  • HTTP स्ट्रीमिंग (सर्वर कनेक्शन का फिर से उपयोग)
  • HTTP लॉन्ग-पोल: हर मैसेज के लिए कनेक्शन
  • HTTP पोल: हर संदेश + कोई डेटा संदेश के लिए कनेक्शन

मोबाइल डिवाइस का समर्थन:

जावास्क्रिप्ट उपयोग जटिलता (सबसे सरल से सबसे जटिल तक)। निश्चित रूप से जटिलता के उपाय कुछ व्यक्तिपरक हैं।

  • WebSockets
  • HTTP पोल
  • प्लगइन नेटवर्किंग
  • HTTP लंबी पोल, स्ट्रीमिंग

यह भी ध्यान दें कि HTTP स्ट्रीमिंग को सर्वर-सेंटेड इवेंट्स को मानकीकृत करने के लिए W3C प्रस्ताव है । यह वर्तमान में विकास के मामले में काफी शुरुआती है और इसे WebSockets के लिए तुलनीय सरलता के साथ एक मानक जावास्क्रिप्ट एपीआई प्रदान करने के लिए डिज़ाइन किया गया है।


1
अच्छा उत्तर कनक के लिए बहुत बहुत धन्यवाद। क्या आप मुझे बता सकते हैं कि http स्ट्रीमिंग का वेबसैट की तुलना में अधिक विलंब क्यों है? शायद एक सरल उदाहरण के साथ? बहुत बहुत धन्यवाद।
सॉफ्टवेयर लड़के

2
@SoftwareGuy। बहुत से कारण। हाल के ब्राउज़रों पर, आप डेटा को अधिसूचित करने के लिए XMLHTTPRequest onprogress घटना हैंडलर का उपयोग कर सकते हैं। लेकिन कल्पना का कहना है कि 50ms सबसे छोटी अधिसूचना अंतराल है। अन्यथा आपको प्रतिक्रिया डेटा के लिए चुनाव करना होगा। इसके अलावा, क्लाइंट एक नया HTTP कनेक्शन स्थापित करता है और इसलिए राउंड-ट्रिप लेटेंसी को काफी बढ़ाता है। साथ ही, कई वेब सर्वर 30 सेकंड के बाद HTTP कनेक्शन काट देते हैं या इसका अर्थ है कि आपको अक्सर सर्वर पुश कनेक्शन को फिर से स्थापित करना पड़ता है। मैंने एक स्थानीय नेटवर्क पर 5-10ms वेबसॉकेट राउंडट्रिप लेटेंसी देखी है। HTTP स्ट्रीमिंग लेटेंसी संभवतः 50ms + होगी।
कनक

विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद :)
सॉफ्टवेयर लड़के

1
@leggetter धन्यवाद फिल, आपका मतलब है कि क्लाइंट से सर्वर पर HTTP स्ट्रीमिंग के माध्यम से डेटा भेजने से ओवरहेड हो जाएगा? एक नया कनेक्शन खोले बिना http स्ट्रीमिंग पर भी सर्वर को डेटा भेजना संभव है? धन्यवाद।
सॉफ्टवेयर लड़के

1
@ नथन एक अच्छा मास्टर डिग्री थीसिस प्रोजेक्ट लगता है! निश्चित रूप से, मतदान एक घटना संचालित मॉडल की तुलना में सिस्टम को व्यस्त रखेगा, लेकिन वास्तव में बिजली की बचत के लिए विभिन्न पैमानों पर काफी व्यापक अनुभवजन्य परीक्षण की आवश्यकता होगी।
कनक

13

दूसरों से कुछ महान जवाब जो बहुत सारी जमीन को कवर करते हैं। यहाँ थोड़ा अतिरिक्त है।

Java Applets, Flash या Silverlight जैसे प्लगइन्स पर WebSockets का एकमात्र लाभ यह है कि WebSockets मूल रूप से ब्राउज़र में निर्मित होते हैं और प्लगइन्स पर भरोसा नहीं करते हैं।

यदि आपके द्वारा इसका मतलब यह है कि आप सॉकेट कनेक्शन स्थापित करने के लिए जावा एप्लेट्स, फ्लैश, या सिल्वरलाइट का उपयोग कर सकते हैं, तो हाँ, यह संभव है। हालाँकि आप यह नहीं देखते हैं कि प्रतिबंधों के कारण वास्तविक दुनिया में भी अक्सर तैनात किया जाता है।

उदाहरण के लिए, बिचौलिये उस यातायात को बंद और कर सकते हैं। WebSocket मानक को मौजूदा HTTP इन्फ्रास्ट्रक्चर के साथ संगत करने के लिए डिज़ाइन किया गया था और इसलिए फायरवॉल और प्रॉक्सीज़ जैसे बिचौलियों द्वारा हस्तक्षेप किए जाने की संभावना कम है।

इसके अलावा, WebSocket समर्पित पोर्ट की आवश्यकता के बिना पोर्ट 80 और 443 का उपयोग कर सकता है, फिर से मौजूदा HTTP इन्फ्रास्ट्रक्चर के साथ संभव के रूप में प्रोटोकॉल डिज़ाइन के लिए धन्यवाद।

उन सॉकेट विकल्प (जावा, फ्लैश और सिल्वरलाइट) को क्रॉस-ऑरिजिन आर्किटेक्चर में सुरक्षित रूप से उपयोग करना मुश्किल है। इस प्रकार लोग अक्सर उन्हें क्रॉस-ऑरिजनल उपयोग करने का प्रयास करते हैं, यह सुरक्षित रूप से करने के प्रयास में जाने के बजाय असुरक्षा को सहन करेंगे।

उन्हें अतिरिक्त "गैर-मानक" पोर्ट खोलने की आवश्यकता हो सकती है (कुछ प्रशासकों को ऐसा करने के लिए घृणा होती है) या नीति फ़ाइलों को प्रबंधित करने की आवश्यकता होती है।

संक्षेप में, सॉकेट कनेक्टिविटी के लिए जावा, फ्लैश, या सिल्वरलाइट का उपयोग करना काफी समस्याग्रस्त है, जिसे आप अक्सर गंभीर आर्किटेक्चर में तैनात नहीं देखते हैं। फ्लैश और जावा में संभवतः कम से कम 10 वर्षों तक यह क्षमता रही है, और अभी तक यह प्रचलित नहीं है।

WebSocket मानक एक नए दृष्टिकोण के साथ शुरू करने में सक्षम था, उन प्रतिबंधों को ध्यान में रखते हुए, और उम्मीद है कि उनसे कुछ सबक सीखे।

जब कुछ वेबस्केट कनेक्टिविटी स्थापित नहीं की जा सकती (जैसे कि एक पुराने ब्राउज़र में चलने पर या जब कोई मध्यस्थ हस्तक्षेप करता है) तो कुछ वेबसॉकेट कार्यान्वयन फ़्लैश (या संभवतः सिल्वरलाइट और / या जावा) का उपयोग करते हैं।

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

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

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

Http स्ट्रीमिंग पर WebSockets का एकमात्र लाभ यह है कि आपको प्राप्त आंकड़ों को "समझने" और पार्स करने का प्रयास नहीं करना पड़ता है।

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

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

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

क्या कोई अन्य महत्वपूर्ण अंतर है जो मुझे याद आ रहा है?

एक और बात है जिसका किसी ने अभी तक उल्लेख नहीं किया है, इसलिए मैं इसे लाऊंगा।

WebSocket प्रोटोकॉल को उच्च-स्तरीय प्रोटोकॉल के लिए एक परिवहन परत के रूप में डिज़ाइन किया गया था। जब आप JSON संदेश भेज सकते हैं या क्या नहीं सीधे एक WebSocket कनेक्शन पर, यह मानक या कस्टम प्रोटोकॉल भी ले जा सकता है।

उदाहरण के लिए, आप WebSocket पर AMQP या XMPP कर सकते हैं, जैसा कि लोग पहले ही कर चुके हैं। इसलिए एक ग्राहक एएमक्यूपी ब्रोकर से संदेश प्राप्त कर सकता है जैसे कि वह सीधे ब्रोकर से जुड़ा हो (और कुछ मामलों में यह है)।

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

(स्वाभाविक रूप से, आप वे सभी सुरक्षित रूप से विक्रेता या WebSocket प्रदाता से जांचना चाहते हैं।)

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

इसलिए JSON (या जो भी) संदेश सीधे WebSocket पर भेजते समय हमेशा संभव होता है, किसी को मौजूदा प्रोटोकॉल पर भी विचार करना चाहिए। क्योंकि कई चीजों के लिए जो आप करना चाहते हैं, शायद एक प्रोटोकॉल है जो पहले से ही ऐसा करने के लिए सोचा गया है।

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

यह एक महान प्रश्न था, और उत्तर सभी बहुत जानकारीपूर्ण रहे हैं!


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

क्योंकि StackOverflow प्रतिक्रिया टिप्पणियों में आकार को सीमित करता है, मैंने अपना जवाब नीचे दिया है: stackoverflow.com/questions/12555043/…
Robin Zimmermann

@RobinZimmermann, आपका जवाब मेरा पसंदीदा है। +1 वास्तव में अच्छे विस्तृत उत्तर के लिए।
अक्टूबर

10

यदि मैं एक अतिरिक्त बात पूछ सकता हूं: मैं कहीं एक लेख में आया था जो कहता है कि http स्ट्रीमिंग को प्रॉक्सी द्वारा भी कैश किया जा सकता है जबकि वेबस्कैट नहीं है। इसका क्या मतलब है?

(स्टैकऑवरफ़्लो टिप्पणी प्रतिक्रियाओं के आकार को सीमित करता है, इसलिए मुझे इनलाइन के बजाय यहां जवाब देना होगा।)

ये एक अच्छा बिंदु है। इसे समझने के लिए, पारंपरिक HTTP परिदृश्य के बारे में सोचें ... कल्पना करें कि एक ब्राउज़र ने एक वेब पेज खोला है, इसलिए यह http://example.com , कहते हैं। सर्वर HTTP के साथ प्रतिक्रिया करता है जिसमें पृष्ठ के लिए HTML होता है। तब ब्राउज़र देखता है कि पृष्ठ में संसाधन हैं, इसलिए यह सीएसएस फ़ाइलों, जावास्क्रिप्ट फ़ाइलों और निश्चित रूप से छवियों का अनुरोध करना शुरू कर देता है। वे सभी स्थिर फाइलें हैं जो सभी ग्राहकों से अनुरोध करने के लिए समान होंगी ।

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

तो क्लाइंट # 1 अनुरोध http://example.com/images/logo.gif , कहते हैं। यह अनुरोध केंद्रीय वेब सर्वर पर प्रॉक्सी के माध्यम से जाता है, जो logo.gif पर कार्य करता है। जैसे ही logo.gif प्रॉक्सी से गुजरता है, प्रॉक्सी उस इमेज को सेव कर लेगा और उसे एड्रेस के साथ जोड़ देगा http://example.com/images/logo.nif

जब क्लाइंट # 2 साथ आता है और http://example.com/images/logo.gif भी अनुरोध करता है , तो प्रॉक्सी छवि को वापस कर सकती है और केंद्र में वेब सर्वर पर वापस संचार की आवश्यकता नहीं है। यह अंतिम उपयोगकर्ता के लिए एक तेज़ प्रतिक्रिया देता है, जो हमेशा महान होता है, लेकिन इसका मतलब यह भी है कि केंद्र पर कम लोड है। यह कम हार्डवेयर लागत, कम नेटवर्किंग लागत आदि में अनुवाद कर सकता है, इसलिए यह अच्छी बात है।

समस्या तब होती है जब वेब सर्वर पर logo.gif को अपडेट किया जाता है। प्रॉक्सी पुरानी छवि से अनजान रहेगी कि नई छवि है। यह पूरी तरह से समाप्ति की ओर जाता है ताकि प्रॉक्सी "एक्सपायर" होने से पहले थोड़े समय के लिए छवि को केवल कैश कर दे और अगला अनुरोध प्रॉक्सी के माध्यम से वेब सर्वर पर जाए, जो तब प्रॉक्सी के कैश को रीफ्रेश करता है। अधिक उन्नत समाधान भी हैं जहां एक केंद्रीय सर्वर ज्ञात कैश को बाहर धकेल सकता है, और इसी तरह, और चीजें बहुत परिष्कृत हो सकती हैं।

यह आपके प्रश्न से कैसे जुड़ा है?

आपने HTTP स्ट्रीमिंग के बारे में पूछा जहां सर्वर क्लाइंट को HTTP स्ट्रीमिंग कर रहा है। लेकिन HTTP को स्ट्रीमिंग करना नियमित HTTP की तरह ही है सिवाय इसके कि आप डेटा भेजना बंद न करें। यदि कोई वेब सर्वर एक छवि परोसता है, तो वह क्लाइंट को HTTP भेजता है जो अंत में समाप्त होता है: आपने पूरी छवि भेज दी है। और यदि आप डेटा भेजना चाहते हैं, तो यह बिल्कुल वैसा ही है, लेकिन सर्वर वास्तव में लंबे समय के लिए भेजता है (जैसे कि यह एक बड़े पैमाने पर विशाल छवि है, कहते हैं) या यहां तक ​​कि कभी भी खत्म नहीं होता है।

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

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

तो यह एक समस्या है।

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


1
उत्कृष्ट विस्तार रॉबिन, बहुत बहुत धन्यवाद! मैं वास्तव में आपकी पूरी प्रतिक्रिया की सराहना करता हूं। मैं यहाँ पहले से ही सभी महान लोगों से बहुत कुछ सीखा है! :)
सॉफ्टवेयर लड़के

4

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

WebSockets एक टीसीपी-आधारित प्रोटोकॉल है और इस तरह से यह HTTP- स्तर कनेक्शन सीमा से ग्रस्त नहीं है (लेकिन, निश्चित रूप से, ब्राउज़र समर्थन एक समान नहीं है)।


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