HTTP / 2 युक्ति को पढ़ने के समाप्त होने के बाद , मुझे लगता है कि HTTP / 2 ज्यादातर उपयोग के मामलों के लिए अप्रचलित वेबस्कैट करता है, लेकिन शायद सभी नहीं।
PUSH_PROMISE
(बोलचाल की भाषा में सर्वर पुश के रूप में जाना जाता है) यहां मुद्दा नहीं है। यह सिर्फ एक प्रदर्शन अनुकूलन है।
एक ब्राउज़र में वेबसोकेट के लिए मुख्य उपयोग मामला डेटा की द्विदिश स्ट्रीमिंग को सक्षम करने के लिए है। इसलिए, मुझे लगता है कि ओपी का सवाल यह है कि क्या HTTP / 2 ब्राउज़र में द्विदिश स्ट्रीमिंग को सक्षम करने का बेहतर काम करता है, और मुझे लगता है कि हाँ, यह करता है।
सबसे पहले, यह है द्वि-di। बस धाराओं खंड का परिचय पढ़ें :
एक "स्ट्रीम" एक HTTP / 2 कनेक्शन के भीतर क्लाइंट और सर्वर के बीच एक्सचेंज किए गए फ्रेम का एक स्वतंत्र, द्विदिश अनुक्रम है। धाराओं की कई महत्वपूर्ण विशेषताएं हैं:
एक एकल HTTP / 2 कनेक्शन में कई समवर्ती खुली धाराएं हो सकती हैं, जिसमें कई धाराओं से अंत: बिंदु इंटरलेविंग फ़्रेम होते हैं।
धाराओं को एकतरफा रूप से स्थापित और उपयोग किया जा सकता है या क्लाइंट या सर्वर द्वारा साझा किया जा सकता है।
धाराओं को समापन बिंदु द्वारा बंद किया जा सकता है।
इस तरह के लेख (दूसरे उत्तर में जुड़े) HTTP / 2 के इस पहलू के बारे में गलत हैं। वे कहते हैं कि यह बीड़ी नहीं है। देखिए, एक चीज है जो HTTP / 2 के साथ नहीं हो सकती है: कनेक्शन खोलने के बाद, सर्वर एक नियमित स्ट्रीम शुरू नहीं कर सकता, केवल एक पुश स्ट्रीम। लेकिन एक बार क्लाइंट अनुरोध भेजकर एक स्ट्रीम खोल देता है, दोनों पक्ष किसी भी समय - एक पूर्ण सॉकेट में DATA फ्रेम भेज सकते हैं।
यह वेबसोकेट्स से बहुत अलग नहीं है: क्लाइंट को सर्वर पर डेटा भेजने से पहले भी वेबसोकेट अपग्रेड अनुरोध शुरू करना होगा।
सबसे बड़ा अंतर यह है कि, वेबसोकेट के विपरीत, HTTP / 2 अपने स्वयं के मल्टीप्लेक्सिंग शब्दार्थों को परिभाषित करता है: कैसे धाराएं पहचानकर्ता प्राप्त करती हैं और कैसे फ़्रेम उस स्ट्रीम की आईडी को ले जाते हैं। HTTP / 2 भी स्ट्रीम को प्राथमिकता देने के लिए प्रवाह नियंत्रण शब्दार्थ को परिभाषित करता है। यह बीड़ी के अधिकांश वास्तविक दुनिया के अनुप्रयोगों में महत्वपूर्ण है।
(यह गलत लेख यह भी कहता है कि वेबसोकेट मानक का बहुसंकेतन है। नहीं, यह नहीं है। यह वास्तव में यह पता लगाना कठिन नहीं है कि बस वेबसोकेट RFC 6455 खोलें और ⌘-F दबाएं, और "मल्टीप्लेक्स" टाइप करें। आपके पढ़ने के बाद।
प्रोटोकॉल एक्स्टेंसिबल होने का इरादा है; भविष्य के संस्करणों की संभावना मल्टीप्लेक्सिंग जैसी अतिरिक्त अवधारणाओं को पेश करेगी।
आप पाएंगे कि वेबसोकेट मल्टीप्लेक्सिंग के लिए 2013 का मसौदा विस्तार है । लेकिन मुझे नहीं पता कि कौन से ब्राउज़र, यदि कोई है, तो उसका समर्थन करें। मैं अपने एसपीए वेबैप को उस एक्सटेंशन के पीछे बनाने की कोशिश नहीं करूंगा, विशेष रूप से HTTP / 2 आने के साथ, समर्थन कभी नहीं आ सकता है)।
मल्टीप्लेक्सिंग ठीक उसी तरह की चीज है जो आपको सामान्य रूप से अपने आप से करनी होती है जब भी आप बीड़ी के लिए एक वेबसोकेट खोलते हैं, कहते हैं, एक प्रतिक्रियाशील रूप से अपडेट करने के लिए सिंगल पेज ऐप को अपडेट करें। मुझे खुशी है कि यह HTTP / 2 कल्पना में है, एक बार और सभी के लिए ध्यान रखा गया है।
यदि आप जानना चाहते हैं कि HTTP / 2 क्या कर सकता है, तो बस gRPC को देखें। gRPC को HTTP / 2 पर लागू किया गया है। विशेष रूप से आधे और पूर्ण द्वैध स्ट्रीमिंग विकल्पों को देखें जो कि जीआरपीसी प्रदान करता है। (ध्यान दें कि वर्तमान में gRPC ब्राउज़र में काम नहीं करता है, लेकिन यह वास्तव में है क्योंकि ब्राउज़र (1) क्लाइंट जावास्क्रिप्ट के लिए HTTP / 2 फ्रेम को उजागर नहीं करते हैं, और (2) आम तौर पर ट्रेलरों का समर्थन नहीं करते हैं, जिनका उपयोग किया जाता है GRPC कल्पना।)
अब भी वेबस्केट में जगह हो सकती है? बड़ा सर्वर है-> ब्राउज़र ने बाइनरी डेटा को धकेल दिया। HTTP / 2 सर्वर-> ब्राउज़र को बाइनरी डेटा को धकेलने की अनुमति देता है, लेकिन यह ब्राउज़र JS में उजागर नहीं होता है। ऑडियो और वीडियो फ्रेम को धक्का देने जैसे अनुप्रयोगों के लिए, यह वेबसोकेट का उपयोग करने का एक कारण है।
संपादित करें: १ Edit जनवरी २०२०
समय के साथ यह उत्तर धीरे-धीरे ऊपर तक पहुंच गया है (जो अच्छा है, क्योंकि यह उत्तर कमोबेश सही है)। हालाँकि, अभी भी कभी-कभार यह कहते हुए टिप्पणी की जाती है कि यह विभिन्न कारणों से सही नहीं है, आमतौर पर PUSH_PROMISE
किसी एक पृष्ठ ऐप में संदेश-उन्मुख सर्वर -> क्लाइंट पुश के बारे में या वास्तव में उपभोग करने के बारे में कुछ भ्रम से संबंधित है । और, एक ब्राउज़र में वेबस्कैट के लिए उपयोग-मामला है, जो सर्वर-पुश बाइनरी डेटा है। JSON सहित पाठ डेटा के लिए, वेबस्कैट का उपयोग न करें, SSE का उपयोग करें।
पुनरावृत्ति करने के लिए: HTTP / 2 प्रोटोकॉल पूर्ण द्वि-दी है। हालाँकि, आधुनिक वेब ब्राउज़र फ़्रेम-उन्मुख HTTP / 2 प्रोटोकॉल को जावास्क्रिप्ट में उजागर नहीं करते हैं । कभी-कभी, यदि आप HTTP / 2 कनेक्शन पर एक ही मूल के लिए कई अनुरोध करते हैं, तो हुड के तहत उस ट्रैफ़िक का एक कनेक्शन पर कई गुना हो रहा है (और यही वह है जिसकी हम परवाह करते हैं!)।
इसलिए यदि आपको एक वास्तविक समय चैट ऐप बनाने की आवश्यकता है, तो आइए हम बताते हैं कि आपको चैट रूम में सभी क्लाइंट के लिए नए चैट संदेशों को प्रसारित करने की आवश्यकता है, जिनके खुले कनेक्शन हैं, आप (और शायद) वेबस्केट के बिना ऐसा कर सकते हैं।
आप संदेशों को नीचे लाने के लिए सर्वर-प्रेषित ईवेंट का उपयोग करेंगे और अनुरोध भेजने के लिए फ़िश एप का उपयोग करेंगे । सर्वर-सेंटेड इवेंट्स (SSE) एक अल्पज्ञात लेकिन अच्छी तरह से समर्थित एपीआई है जो एक संदेश-उन्मुख सर्वर-टू-क्लाइंट स्ट्रीम को उजागर करता है। यद्यपि यह क्लाइंट जावास्क्रिप्ट के समान नहीं दिखता है, हुड के तहत आपका ब्राउज़र (यदि यह HTTP / 2 का समर्थन करता है) उन सभी संदेशों को मल्टीप्लेक्स करने के लिए एकल टीसीपी कनेक्शन का पुन: उपयोग करेगा। कोई दक्षता हानि नहीं है और वास्तव में यह वेबसोकेट पर लाभ है। कई धाराओं की आवश्यकता है? कई घटनाएँ खोलें! वे स्वचालित रूप से आपके लिए गुणा हो जाएंगे।
अधिक संसाधन कुशल होने और वेबस्कैट हैंडशेक की तुलना में कम प्रारंभिक विलंबता होने के अलावा, सर्वर द्वारा भेजे गए घटनाक्रम में अच्छी संपत्ति है कि वे स्वचालित रूप से वापस आते हैं और HTTP / 1.1 पर काम करते हैं। लेकिन जब आपके पास HTTP / 2 कनेक्शन होता है तो वे अविश्वसनीय रूप से अच्छी तरह से काम करते हैं।
यहाँ एक अच्छा लेख है जिसमें प्रतिक्रियाशील-अद्यतन एसपीए को पूरा करने का एक वास्तविक दुनिया उदाहरण है।