AJAX के लंबे / छोटे मतदान को किन परिस्थितियों में एचटीएमएल 5 वेब पॉकेट पर पसंद किया जाएगा?


306

मैं दोस्तों के लिए एक छोटी सी चैट एप्लिकेशन का निर्माण कर रहा हूं, लेकिन इस बात के बारे में अनिश्चित है कि समय पर जानकारी कैसे प्राप्त की जाए जो कि पृष्ठ ताज़ा करने के लिए मैनुअल या अल्पविकसित के रूप में नहीं है।

वर्तमान में, मैं इसे सरल AJAX का उपयोग करके लागू कर रहा हूं, लेकिन इससे सर्वर को नियमित रूप से टकराने का नुकसान होता है जब एक छोटा टाइमर समाप्त हो जाता है।

लंबे / छोटे मतदान पर शोध करने के दौरान, मैं HTML5 वेबसॉकेट में भाग गया। यह लागू करना आसान लगता है, लेकिन मुझे यकीन नहीं है कि कुछ छिपे हुए नुकसान हैं। उदाहरण के लिए, मुझे लगता है कि WebSockets केवल कुछ ब्राउज़रों द्वारा समर्थित है। क्या वेबसॉकेट्स के अन्य नुकसान हैं जिनसे मुझे अवगत होना चाहिए?

चूंकि ऐसा लगता है कि दोनों प्रौद्योगिकियां एक ही काम करती हैं, ऐसे में किस तरह के परिदृश्यों में एक दूसरे का उपयोग करना पसंद करेंगे? अधिक विशेष रूप से, HTML5 WebSockets ने AJAX को लंबे / छोटे मतदान को अप्रचलित बना दिया है, या क्या वेब कार्ड पर AJAX को पसंद करने के लिए आकर्षक कारण हैं?

जवाबों:


508

WebSockets निश्चित रूप से भविष्य है।

AJAX करता है - जब प्रत्येक अनुरोध के लिए कनेक्शन बनाने से रोकने के लिए लॉन्ग पोलिंग एक गंदा वर्कअराउंड है, लेकिन वेबसॉफ़्ट के मौजूद न होने पर लंबी पोलिंग बनाई गई। अब WebSockets के कारण, लंबा मतदान समाप्त हो रहा है।

WebRTC सहकर्मी से सहकर्मी संचार के लिए अनुमति देता है।

मैं WebSockets सीखने की सलाह देता हूं ।

तुलना:

वेब पर विभिन्न संचार तकनीकों के

  • AJAX - requestresponse। सर्वर से कनेक्शन बनाता है, वैकल्पिक डेटा के साथ अनुरोध हेडर भेजता है, सर्वर से प्रतिक्रिया प्राप्त करता है, और कनेक्शन को बंद कर देता है। सभी प्रमुख ब्राउज़रों में समर्थित है।

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

  • WebSockets - clientserver। सर्वर से एक टीसीपी कनेक्शन बनाएं, और इसे आवश्यकतानुसार खुला रखें। सर्वर या क्लाइंट आसानी से कनेक्शन बंद कर सकते हैं। क्लाइंट HTTP संगत हैंडशेक प्रक्रिया से गुजरता है। यदि यह सफल होता है, तो सर्वर और क्लाइंट किसी भी समय दोनों दिशाओं में डेटा का आदान-प्रदान कर सकते हैं। यदि एप्लिकेशन को दोनों तरीकों से लगातार डेटा विनिमय की आवश्यकता होती है तो यह कुशल है। WebSockets में डेटा फ़्रेमिंग है जिसमें क्लाइंट से सर्वर पर भेजे गए प्रत्येक संदेश के लिए मास्किंग शामिल है, इसलिए डेटा को बस एन्क्रिप्ट किया गया है। समर्थन चार्ट (बहुत अच्छा) | विकिपीडिया

  • WebRTC - peerpeer। ग्राहकों के बीच संचार स्थापित करने के लिए परिवहन और परिवहन-अज्ञेयवादी है, इसलिए यह यूडीपी, टीसीपी या यहां तक ​​कि अधिक सार परतों का उपयोग कर सकता है। यह आमतौर पर उच्च मात्रा डेटा ट्रांसफर के लिए उपयोग किया जाता है, जैसे कि वीडियो / ऑडियो स्ट्रीमिंग, जहां विश्वसनीयता माध्यमिक है और कुछ फ्रेम या गुणवत्ता में कमी से प्रतिक्रिया समय के पक्ष में बलिदान किया जा सकता है और, कम से कम, कुछ डेटा ट्रांसफर। दोनों पक्ष (सहकर्मी) डेटा को स्वतंत्र रूप से एक दूसरे को धक्का दे सकते हैं। हालांकि इसे किसी भी केंद्रीकृत सर्वर से पूरी तरह से स्वतंत्र रूप से उपयोग किया जा सकता है, फिर भी इसे एंडपॉइंट डेटा का आदान-प्रदान करने के कुछ तरीके की आवश्यकता होती है, जहां ज्यादातर मामलों में डेवलपर्स अभी भी केंद्रीकृत सर्वर का उपयोग "लिंक" करने के लिए करते हैं। यह केवल कनेक्शन स्थापित करने के लिए आवश्यक डेटा का आदान-प्रदान करने के लिए आवश्यक है, जिसके बाद एक केंद्रीकृत सर्वर की आवश्यकता नहीं है। समर्थन चार्ट (मध्यम) | विकिपीडिया

  • सर्वर-प्रेषित ईवेंट - clientserver। क्लाइंट सर्वर के लिए लगातार और दीर्घकालिक कनेक्शन स्थापित करता है। केवल सर्वर ही क्लाइंट को डेटा भेज सकता है। यदि क्लाइंट सर्वर को डेटा भेजना चाहता है, तो उसे ऐसा करने के लिए किसी अन्य तकनीक / प्रोटोकॉल के उपयोग की आवश्यकता होगी। यह प्रोटोकॉल ज्यादातर सर्वर-साइड प्लेटफॉर्म में HTTP संगत और सरल है। यह लॉन्ग पोलिंग के बजाय प्रयोग किया जाने वाला एक बेहतर प्रोटोकॉल है। समर्थन चार्ट (अच्छा, IE को छोड़कर) | विकिपीडिया

लाभ:

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

सुरक्षा के विचार

लोग अक्सर वेबस्केट्स की सुरक्षा को लेकर चिंतित रहते हैं। वास्तविकता यह है कि इससे बहुत कम फर्क पड़ता है या यहां तक ​​कि बेहतर विकल्प के रूप में वेबसॉकेट्स भी डालते हैं। सबसे पहले, AJAX के साथ, MITM की अधिक संभावना है , क्योंकि प्रत्येक अनुरोध एक नया टीसीपी कनेक्शन है जो इंटरनेट बुनियादी ढांचे के माध्यम से ट्रैवर्सिंग कर रहा है। WebSockets के साथ, एक बार कनेक्ट होने के बाद यह बीच में अवरोधन करने के लिए अधिक चुनौतीपूर्ण होता है, इसके अलावा जब ग्राहक से सर्वर के साथ-साथ अतिरिक्त संपीड़न में स्ट्रीम किया जाता है, तो डेटा की जांच के लिए अधिक प्रयास की आवश्यकता होती है। सभी आधुनिक प्रोटोकॉल दोनों का समर्थन करते हैं: HTTP और HTTPS (एन्क्रिप्टेड)।

पुनश्च

याद रखें कि आमतौर पर WebSockets के पास नेटवर्किंग के लिए तर्क का एक बहुत ही अलग तरीका है , जैसे कि वास्तविक समय के खेल में यह सब होता है, और http की तरह नहीं।


15
यह अनुकूलता के बारे में नहीं है यह स्व। सबसे महत्वपूर्ण है कि यह संचार के तरीके को पूरी तरह से पुनर्विचार करने के बारे में है। जैसा कि RESTful API अनुरोध> प्रतिक्रिया पैटर्न के साथ काम करता है, यहाँ द्वि-दिशात्मक संचार व्यर्थ होगा। इसलिए Restful API को क्वेरी करने के लिए WebSockets का उपयोग करने की कोशिश करना - थोड़ा अजीब प्रयास है, और इसका कोई भी लाभ नहीं देख सकता है। यदि आपको RESTful API से डेटा की आवश्यकता होती है, लेकिन वास्तविक समय में, तो आप डेटा को पुश करने के लिए WebSockets Api का निर्माण करते हैं जो WebSockets जैसे द्विदिश संचार के साथ काम करेगा। आप चीजों को कोण में तुलना करने की कोशिश कर रहे हैं कि वे तुलनीय नहीं हैं :)
मोका

2
हाय @pithhelmet यह सब सर्वर साइड सॉफ्टवेयर (भाषा / तकनीक) पर निर्भर करता है यह स्व। WebSocket TCP पर लेयर है, और TCP स्ट्रीम इम्प्लीमेंटेशन करने के कई तरीके हैं। आधुनिक वेब सर्वर इवेंट-आधारित आर्किटेक्चर का उपयोग करते हैं, और थ्रेड पूल के साथ बहुत कुशल हैं। आप किस तकनीक का उपयोग कर रहे हैं? Node.js IO के लिए पर्दे के पीछे की घटनाओं का उपयोग करता है, और निष्पादन के संदर्भ में एकल थ्रेड के साथ घटना है, इसलिए यह आश्चर्यजनक रूप से कुशल है। प्रत्येक कनेक्शन के लिए थ्रेड का उपयोग करना - RAM (1mb + प्रति थ्रेड) के साथ-साथ CPU के संदर्भ में बहुत ही अयोग्य है, क्योंकि ये थ्रेड्स केवल निष्क्रिय या बदतर होंगे - डेटा के लिए अनंत लूप।
मोका

4
लंबा मतदान एक गंदा काम नहीं है, और यह वेबस्केट से अलग है। ये दोनों अलग-अलग परिदृश्य में उपयोग करने के लिए हैं।
bagz_man

5
@bagz_man लॉन्ग पोलिंग परिणाम प्राप्त करने के लिए प्रौद्योगिकी का एक "हैकी" उपयोग है जो तकनीक ने परिभाषा द्वारा अनुमति नहीं दी थी और मानक विकल्प उपलब्ध नहीं था। लॉन्ग पोलिंग मौजूद होने का कारण वास्तव में WS था, जो अवधि नहीं था।
मोका

4
@ अशोक: क्लाउडफ्लेयर का फ्री-टियर 400 + Gbps के हमले को अवशोषित करेगा। क्या आपका बटुआ AWS बिल को अवशोषित कर सकता है? इसके अलावा AWS और Cloudflare के विपरीत विचार हैं जब यह आपके मूल के खिलाफ शिकायतों से निपटने के लिए आता है। जब तक हम व्यापार की चर्चा कर रहे हैं, यह ध्यान में रखना कुछ है। :)
दानेउ

11

आपके द्वारा छोड़ी गई एक प्रतियोगी तकनीक सर्वर-प्रचलित ईवेंट / ईवेंट स्रोत है। लांग-पोलिंग, वेबसोकेट, सर्वर-सेंटेड इवेंट्स (SSE) और धूमकेतु क्या हैं? इन सभी की अच्छी चर्चा है। ध्यान रखें कि इनमें से कुछ सर्वर की ओर से एकीकृत करने के लिए दूसरों की तुलना में आसान हैं।


इन सब में से, आप किस पर ध्यान देना चाहेंगे?
सोमदेव

मुझे लंबे समय से मतदान के साथ सफलता मिली है, केवल ट्रिक (इसके और अन्य तकनीकों के लिए) सर्वर थ्रेड को बांध नहीं रहा है। यदि आप अतुल्यकालिक सर्वर कोड का उपयोग नहीं करते हैं तो यह पैमाने पर नहीं होगा।
bmm6o

1
@ एसओएमडीओ माक्सिम्स-मिहेजेव्स ने आपके उत्तर के पहले दो पैराग्राफ में आपके प्रश्न का अच्छी तरह से उत्तर दिया। वेबस्केट का उपयोग करें।
जेफ शेफील्ड

7

चैट एप्लिकेशन या किसी अन्य एप्लिकेशन के लिए जो सर्वर के साथ निरंतर बातचीत में है, WebSocketsसबसे अच्छा विकल्प है। हालाँकि, आप केवल WebSocketsउनका समर्थन करने वाले सर्वर के साथ उपयोग कर सकते हैं, ताकि यदि आप आवश्यक लाइब्रेरी स्थापित नहीं कर पा रहे हैं, तो उन्हें उपयोग करने की आपकी क्षमता को सीमित कर सकें। किस मामले में, आपको Long Pollingसमान कार्यक्षमता प्राप्त करने के लिए उपयोग करने की आवश्यकता होगी ।


5
WebSockets हर सर्वर द्वारा समर्थित हैं ... आपको केवल नोड.जेएस या कुछ समान स्थापित करने की आवश्यकता है।
नोब

9
थोड़ा समझाने के लिए कि हाँ कोई भी सर्वर WebSockets का समर्थन करेगा। हालाँकि, यदि आप होस्टिंग सेवा का उपयोग कर रहे हैं, तो आप उनका उपयोग नहीं कर सकते।
ब्रेंट ऑलसेन

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

1
@Stoney इस तथ्य से अलग है कि आपको सर्वर (हैंडलर, आदि) पर वेबसोकेट सेटअप करने की आवश्यकता होगी। वेबसैट पर लॉन्ग पोलिंग का उपयोग करने का कोई कारण नहीं है। Websocket बहुत तेज (कम विलंबता) है और सर्वर को क्लाइंट से "बात" करने की अनुमति देता है बिना क्लाइंट से यह पूछे। आजकल मैं सिग्नल का उपयोग करता हूं (मेरी राय में बनाई गई वेबसोकेट का सबसे अच्छा कार्यान्वयन में से एक - यह क्लाइंट और सर्वर पर चलता है और क्लाइंट को क्लाइंट और सर्वर पर तरीकों को कॉल करने की अनुमति देता है जैसे कि कोई अंतर नहीं है) हर पर वेबसाइट I - डायनामिक कंटेंट लोडिंग,
बॉटमलेस

0

XHR पोलिंग बनाम SSE बनाम वैबसाइट्स

  • XHR पोलिंग ए रिक्वेस्ट का जवाब तब दिया जाता है जब घटना होती है (सीधे दूर हो सकती है, या देरी के बाद)। इसके बाद के अनुरोधों को आगे के कार्यक्रम प्राप्त करने की आवश्यकता होगी।

    ब्राउज़र सर्वर के एक अतुल्यकालिक अनुरोध करता है, जो प्रतिक्रिया देने से पहले डेटा उपलब्ध होने की प्रतीक्षा कर सकता है। प्रतिक्रिया में एन्कोडेड डेटा (आमतौर पर XML या JSON) या जावास्क्रिप्ट क्लाइंट द्वारा निष्पादित किया जा सकता है। प्रतिक्रिया के प्रसंस्करण के अंत में, ब्राउज़र अगली घटना की प्रतीक्षा करने के लिए एक और XHR बनाता है और भेजता है। इस प्रकार ब्राउज़र हमेशा सर्वर के साथ एक अनुरोध को बकाया रखता है, जिसका उत्तर प्रत्येक घटना के रूप में दिया जाता है। विकिपीडिया

  • सर्वर भेजा इवेंट क्लाइंट सर्वर के लिए अनुरोध भेजता है। सर्वर किसी भी समय वेबपृष्ठ पर नया डेटा भेजता है।

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

  • प्रारंभिक हैंडशेक के बाद (HTTP प्रोटोकॉल के माध्यम से) वेबसॉकेट्स । WebSocket प्रोटोकॉल का उपयोग करके अप्रत्यक्ष रूप से संचार किया जाता है।

    हैंडशेक एक HTTP अनुरोध / प्रतिक्रिया के साथ शुरू होता है, जिससे सर्वर HTTP कनेक्शन और साथ ही उसी पोर्ट पर WebSocket कनेक्शन को हैंडल कर सकते हैं। एक बार कनेक्शन स्थापित हो जाने के बाद, संचार एक द्विदिश बाइनरी प्रोटोकॉल पर स्विच हो जाता है जो HTTP प्रोटोकॉल के अनुरूप नहीं है। विकिपीडिया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.