WebSockets बनाम सर्वर-भेजा घटनाओं / EventSource


838

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


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

54
WebSockets दो-तरफ़ा है, यह सर्वर को डेटा भेज सकता है।
आंद्रे बैकलुंड

13
एक चीज जो मुझे वास्तव में SSE के बारे में पसंद है, वह यह है कि समस्या निवारण के लिए यह आसान है ... बस अपने SSE सर्वर का उपयोग करने के लिए एक अनुरोध खोलें curl। चूंकि यह HTTP पर सिर्फ एक पाठ प्रारूप है, इसलिए यह देखना आसान है कि क्या हो रहा है।
सैम

7
@BrianDriscoll - एसिंक्रोनस / सिंक्रोनस - कौन सा है? जहाँ तक मैं समझ सकता हूँ दोनों अतुल्यकालिक स्थानान्तरण सक्षम करते हैं?
डेव एवरिट

5
SSE IE पर काम नहीं करता है, websockets करता है
टायलर Gillies

जवाबों:


977

Websockets और SSE (सर्वर सेंटेड इवेंट्स) दोनों ब्राउज़रों को डेटा पुश करने में सक्षम हैं, हालांकि वे प्रतिस्पर्धा करने वाली तकनीक नहीं हैं।

Websockets कनेक्शन दोनों ब्राउज़र को डेटा भेज सकते हैं और ब्राउज़र से डेटा प्राप्त कर सकते हैं। एक आवेदन का एक अच्छा उदाहरण जो वेबस्केट का उपयोग कर सकता है वह एक चैट अनुप्रयोग है।

SSE कनेक्शन केवल ब्राउज़र को डेटा पुश कर सकते हैं। ऑनलाइन स्टॉक कोट्स, या टाइमलाइन या फीड अपडेट करने वाले ट्विटर्स एक एप्लिकेशन के अच्छे उदाहरण हैं जो एसएसई से लाभान्वित हो सकते हैं।

व्यवहार में चूंकि SSE के साथ किया जा सकता है सब कुछ Websockets के साथ भी किया जा सकता है, Websockets को बहुत अधिक ध्यान और प्यार मिल रहा है, और कई और ब्राउज़र SSE की तुलना में Websockets का समर्थन करते हैं।

हालांकि, यह कुछ प्रकार के आवेदन के लिए ओवरकिल हो सकता है, और बैकएंड को एसएसई जैसे प्रोटोकॉल के साथ लागू करना आसान हो सकता है।

इसके अलावा SSE को पुराने ब्राउज़रों में पॉलीफ़िल किया जा सकता है जो केवल जावास्क्रिप्ट का उपयोग करके मूल रूप से इसका समर्थन नहीं करते हैं। SSE पॉलीफ़िल के कुछ कार्यान्वयन मॉडर्निज़र जीथब पृष्ठ पर पाए जा सकते हैं ।

gotchas:

  • एसएसई एक सीमा से अधिक से अधिक खुले कनेक्शनों से ग्रस्त है, जो विभिन्न टैब खोलने पर विशेष रूप से दर्दनाक हो सकता है क्योंकि सीमा प्रति ब्राउज़र है और बहुत कम संख्या (6) पर सेट है। इस मुद्दे को क्रोम और फ़ायरफ़ॉक्स में "W't fix" के रूप में चिह्नित किया गया है । यह सीमा ब्राउज़र + डोमेन के अनुसार है, इसका मतलब है कि आप सभी टैब के 6 SSE कनेक्शन खोल सकते हैं www.example1.comऔर अन्य 6 SSE कनेक्शन www.example2.com(धन्यवाद फाटे) कर सकते हैं।
  • केवल WS द्विआधारी डेटा और UTF-8 दोनों को प्रेषित कर सकता है, SSE UTF-8 तक सीमित है। (चाडो निही को धन्यवाद)।
  • पैकेट निरीक्षण वाले कुछ एंटरप्राइज़ फ़ायरवॉल को WebSockets (सोफ़ोस XG फ़ायरवॉल, वॉचगार्ड, McAfee वेब गेटवे) से निपटने में परेशानी होती है।

HTML5Rocks में SSE के बारे में कुछ अच्छी जानकारी है। उस पेज से:

सर्वर-प्रेषित ईवेंट बनाम वेबसॉकेट

आप वेब-पॉकेट पर सर्वर-भेजे गए ईवेंट क्यों चुनेंगे? अच्छा प्रश्न।

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

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


TLDR सारांश:

वेबसैट पर SSE के लाभ:

  • कस्टम प्रोटोकॉल के बजाय सरल HTTP पर ले जाया गया
  • उन ब्राउज़र को "बैकपोर्ट" एसएसई के लिए जावास्क्रिप्ट के साथ पाली भरा जा सकता है जो अभी तक इसका समर्थन नहीं करते हैं।
  • पुनः कनेक्शन और इवेंट-आईडी के लिए समर्थन में निर्मित
  • सरल प्रोटोकॉल
  • पैकेट निरीक्षण कर रही कॉर्पोरेट फायरवॉल से कोई परेशानी नहीं

SSE से अधिक वेबसोकेट के लाभ:

  • वास्तविक समय, दो दिशात्मक संचार।
  • अधिक ब्राउज़रों में मूल समर्थन

SSE के आदर्श उपयोग के मामले:

  • स्टॉक टिकर स्ट्रीमिंग
  • ट्विटर फीड अपडेट
  • ब्राउज़र को सूचनाएं

SSE gotchas:

  • कोई बाइनरी सपोर्ट नहीं
  • अधिकतम खुले कनेक्शन की सीमा

131
SSE के साथ चैट पूरी तरह से संभव है - आप सर्वर पर संदेश भेजने के लिए नियमित POST का उपयोग कर सकते हैं। यदि आप चैट गूगल वेव को लागू कर रहे हैं, तो वेबस्केट की आवश्यकता होगी।
कोर्नेल

135
यह सही है कि SSE के साथ चैट और अन्य रियल टाइम एप्लिकेशन किए जा सकते हैं। हालांकि, इसके लिए पोस्टिंग उत्तरों की "आउट ऑफ बैंड" की आवश्यकता होती है, अर्थात, यह एसएसई प्रोटोकॉल द्वारा नियंत्रित नहीं होता है, और एसएसई और वेबसोकेट के बीच के अंतर पर एक बुनियादी स्पष्टीकरण के लिए एक अच्छा उदाहरण नहीं लगता है। आप मूल HTTP मतदान सर्वर के साथ हर दूसरे और पोस्टिंग नए उत्तरों को लागू कर सकते हैं। इसका मतलब यह नहीं है कि यह सबसे अच्छा / सबसे सुंदर तरीका है।
एलेक्स रिकारे

14
मुझे लगता है कि pomeL का समाधान ज्यादातर मामलों के लिए एक महान समझौता है, क्योंकि JS हमेशा AJAX POST के साथ सर्वर को "पुश" कर सकता है। मेरे अनुभव से, मुख्य मुद्दा आम तौर पर नई जानकारी के लिए जेएस के चुनाव की आवश्यकता है, लेकिन एसएसई इस बात का ध्यान रखता है। : डी
जैकब प्रिटचेट

12
@MattDiPasquale वेव हर कुंजी को व्यक्तिगत रूप से भेजते हैं क्योंकि आपने इसे एक बार में पूर्ण संदेश के बजाय टाइप किया था। WebSocket के लिए लगभग 6 की तुलना में 1 कीस्ट्रोक के लिए POST ओवरहेड के 200 बाइट बेकार हो जाएंगे।
कोर्नेल

9
यह कहना थोड़ा अजीब लगता है कि वे प्रतिस्पर्धा करने वाली प्रौद्योगिकियां नहीं हैं, और फिर यह वर्णन करने के लिए आगे बढ़ें कि वे दोनों समान समाधान प्राप्त करने के लिए उपयोग किए जा सकते हैं। मैं कहूंगा कि इससे उन्हें प्रतिस्पर्धा मिलती है।
एलेक्स

115

Caniuse.com के अनुसार:

आप SSE के समर्थन को कई अन्य ब्राउज़रों तक पहुँचाने के लिए क्लाइंट-ओनली पॉलीफ़िल का उपयोग कर सकते हैं। WebSockets के साथ इसकी संभावना कम है। कुछ EventSource पॉलीफ़िल:

  • किसी अन्य पुस्तकालय निर्भरता (IE7 +) के साथ रेमी शार्प द्वारा EventSource
  • रिक वाल्ड्रॉन द्वारा jQuery.EventSource
  • Yaffle द्वारा EventSource (मूल कार्यान्वयन को प्रतिस्थापित करता है, ब्राउज़र में व्यवहार को सामान्य करता है)

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

SSE के बारे में अधिक जानें:

WebSockets के बारे में और जानें:

अन्य अंतर:

  • WebSockets मनमाना बाइनरी डेटा का समर्थन करता है, SSE केवल UTF-8 का उपयोग करता है

3
मैं २०१६ में इंगित करना चाहता हूं> ९ ५% वैश्विक उपयोगकर्ता नेटवर्क्स का समर्थन करते हैं। सभी ब्राउज़रों और उपकरणों ने 4 साल से अधिक समय से वेबस्केट का समर्थन किया है। AJAX के लंबे मतदान के लिए सॉकेट.आईओबैकबैक करेगा और यदि यह समर्थित नहीं है, तो आपके लिए वेबस्केट्स के अनुकरण की जटिलताओं को संभाल लेगा, जो 100% समर्थन करता है। अगर आप 2016 में कुछ भी उपयोग कर रहे हैं, लेकिन आप पुरानी तकनीक का उपयोग कर रहे हैं।
निक स्टील

3
@NickSteele यह बकवास बयान है। यदि वे आपके उपयोग के मामले को पूरा करते हैं और कुछ भी पुराना नहीं है, तो पुराने मानकों पर भरोसा करना पूरी तरह से ठीक है। यह सिर्फ एक अलग मानक है। Ex: XHR अभी भी बहुत सारी चीज़ें कर सकता है Fetch API नहीं कर सकता, इसलिए यह पुराना नहीं है। ये अलग है। मैंने अतीत में WS का उपयोग किया है, लेकिन अनुभव से पता है कि कोई भी शोर एंटरप्राइज़ फ़ायरवॉल के रूप में स्नैग को हिट कर सकता है जो उस अनुरोध को ब्लॉक करता है जब वह WS को नहीं समझता है। SSE यह क्या करता है के लिए अति-कुशल है, तुच्छ समझ में आता है और लागू करने योग्य और डिबग करने में आसान है। हमारे एक तरफ़ा डेटाफ़्लो के लिए, यह एकदम सही है।
ऑलिगॉफ्रेन

@oligofren को शपथ लेने की आवश्यकता नहीं है। यदि कुछ को पिछले संस्करण को बदलने के लिए डिज़ाइन किया गया है, और यह उद्योग हर तरह से स्वीकृत और बेहतर है, तो परिभाषा के अनुसार, पुराना तरीका पुराना है। जैसे मूल iPhone पुराना है, वैसे ही XHR है। XHR YouTube, Netflix, Facebook और यहां तक ​​कि MySpace से पहले फ़ायरफ़ॉक्स, क्रोम, पहले iPhone के रूप में सामने आया। जब XHR बाहर आया Windows 98 सबसे अच्छा OS था, AOL सबसे अच्छा प्रदाता था, और JSON भी मौजूद नहीं था। लगभग एक दशक पहले वेबशोर ने एक्सएचआर की जगह ले ली थी। यदि आप WS का उपयोग करते हुए स्नैग मारते हैं, तो यह कारण है कि स्नैग भी पुराना है। अब तक पिछड़ने का कोई बहाना नहीं है।
निक स्टील

4
BS को हाइपरबोले के साथ बदलें फिर :-) WS XHR / HTTP के लिए कोई रिप्लेसमेंट नहीं है, ड्रोन से ज्यादा डिलीवरी कारों के लिए हैं। यह अलग-अलग उपयोग के मामले हैं। WS HTTP नहीं है और अलग-अलग स्वीट स्पॉट हैं। यदि आप कोशिश करेंगे तो आप उपयोगकर्ता स्थान में HTTP (खराब) को फिर से लागू करेंगे। इसके अलावा, आप उन चीजों को लागू कर रहे हैं जिन्हें तथ्य नहीं दिए गए हैं: डब्ल्यूएस केवल एक द्विदिश प्रोटोकॉल है जो सर्वर पुश का समर्थन करता है। मैंने कभी भी किसी भी डिज़ाइन डॉक्स का उल्लेख नहीं देखा है कि इसे किसी भी चीज़ के प्रतिस्थापन के रूप में विकसित किया गया है। स्रोत? अपने आप में आयु कोई कारक नहीं है। जब एक विकल्प दिया जाता है, तो अपनी सभी आवश्यकताओं की जांच करते हुए सबसे सरल कार्यान्वयन चुनें।
ऑलिगॉफ्रेन

1
यह सिर्फ दो साल पहले (2017) है मैं नोड जेएस प्रक्रियाओं के ढेर डंपिंग कर रहा था जहां सॉकेट.आईओ कोड IIS प्रक्रिया में बड़े पैमाने पर मेमोरी विखंडन पैदा कर रहा था, सीधे एज़्योर की नोड टीम के साथ बात कर रहा था। कुल जटिलता मुक्त करने के लिए नहीं है। यदि आप सर्वर पर अपनी निर्भरता के रूप में एक साधारण 20 लाइन स्क्रिप्ट के साथ दूर हो सकते हैं, जबकि अभी भी 100K ग्राहकों की सेवा करने में सक्षम है, तो मैं इसके लिए जाऊंगा। मैं डब्ल्यूएस से प्यार करता हूं, हालांकि यह क्या करता है, लेकिन एक समाधान चुनने से पहले आपको क्या देखना चाहिए।
ऑलिगॉफ्रेन

16

ओपेरा, क्रोम, सफारी एसएसई का समर्थन करता है, क्रोम, सफारी साझा के अंदर SSE का समर्थन करता है SharedWorker फ़ायरफ़ॉक्स XMLHttpRequest रेडीस्टेट इंटरएक्टिव का समर्थन करता है, इसलिए हम फ़ायरफ़ॉक्स के लिए EventSource पॉलीफ़िल बना सकते हैं


8

Websocket VS SSE


वेब सॉकेट - यह एक प्रोटोकॉल है जो एक एकल टीसीपी कनेक्शन पर पूर्ण-द्वैध संचार चैनल प्रदान करता है। उदाहरण के लिए, सर्वर और ब्राउज़र के बीच दो-तरफ़ा संचार चूंकि प्रोटोकॉल अधिक जटिल है, सर्वर और ब्राउज़र को वेबसैट की लाइब्रेरी पर निर्भर रहना पड़ता है जो हैsocket.io

Example - Online chat application.

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

Example - Online stock quotes or cricket score website.

4

एक बात ध्यान दें:
मेरे पास वेबसोकेट और कॉर्पोरेट फायरवॉल के साथ समस्याएँ हैं। (HTTPS का उपयोग करना मदद करता है लेकिन हमेशा नहीं।)

Https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-fire-software पर देखें https://github.com/sockjs/sockjs-client/issues/94

मुझे लगता है कि सर्वर-प्रेषण घटनाओं के साथ उतने मुद्दे नहीं हैं। लेकिन मुझे नहीं पता।

उस ने कहा, WebSockets मज़ा के टन हैं। मेरा एक छोटा सा वेब गेम है जो वेबसैट (सॉकेट के माध्यम से) का उपयोग करता है। ( http://minibman.com )


1
मेरे पास कॉरपोरेट फ़ायरवॉल के साथ समस्याएँ भी हैं।
ऑलिगॉफ्रेन

1
सर्वर-सेंटेड इवेंट्स के साथ मैंने देखा है कि एक समस्या यह है कि कुछ परदे के पीछे / फ़ायरवॉल इसे ब्लॉक कर सकते हैं क्योंकि इसमें कंटेंट-लेंथ हेडर नहीं है
ड्रू लेउसर

2

यहां वेब सॉकेट और सर्वर द्वारा भेजे गए घटनाओं के बीच अंतर के बारे में बात की गई है। चूंकि जावा ईई 7 एक वेबसॉकेट एपीआई पहले से ही विनिर्देश का हिस्सा है और ऐसा लगता है कि सर्वर भेजे गए ईवेंट एंटरप्राइज़ संस्करण के अगले संस्करण में जारी किए जाएंगे ।


-3

Http2 + sse के साथ अधिकतम कनेक्शन सीमा कोई समस्या नहीं है।

यह http 1 पर एक मुद्दा था


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

1
HTTP / 2 धाराएँ भी संख्या में सीमित हैं, यह सर्वरों को एकल ब्राउज़र द्वारा बमबारी से बचाता है और ब्राउज़रों को सीमित संख्या में अपनी बहुसंकेतन को सीमित करने के लिए मजबूर करता है - जो, हमारे मामले में, HTTP / 1.1 कनेक्शन के समान है। , जो आपको SSE कनेक्शन सीमा पर वापस लाता है।
मिस्टर

मुझे लगता है कि वेबसोकेट कनेक्शन भी सर्वर संसाधनों का उपभोग करता है। samsaffron.com/archive/2015/12/29/websockets-caution-required । अपनी जेब की अनुमति के रूप में हमेशा कॉन्फ़िगर करने की क्षमता रखने के लिए यह अच्छा है।
user1948585

यह संभावना है कि एसएसई अधिकांश सर्वरों पर समान संसाधनों का उपभोग करेगा (यदि अभी भी मौजूद HTTP स्टैक के कारण अधिक संसाधन नहीं हैं और यह सीमाएं हैं)।
मिस्ट्री

1
यह उत्तर सही है। HTTP / 2 का उपयोग करते समय 6 HTTP कनेक्शन की सीमा अब मौजूद नहीं है। प्रमाण: codepen.io/dunglas/pen/yLYxdxK?editors=1010 HTTP / 2 के साथ, यह सर्वर और क्लाइंट एक साथ धाराओं की अधिकतम संख्या (डिफ़ॉल्ट रूप से 100) पर बातचीत कर सकता है।
केविन डुंगलास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.