क्या HTML WebSockets प्रत्येक ग्राहक के लिए एक खुला संबंध बनाए रखता है? क्या यह पैमाना है?


159

मुझे उत्सुकता है अगर किसी को HTML WebSockets की मापनीयता के बारे में कोई जानकारी है। मैंने जो कुछ पढ़ा है उसके लिए यह प्रतीत होता है कि हर ग्राहक सर्वर के साथ संचार की एक खुली रेखा बनाए रखेगा। मैं बस सोच रहा हूँ कि कैसे तराजू और कितने खुले WebSocket कनेक्शन एक सर्वर को संभाल सकता है। शायद उन कनेक्शनों को खुला छोड़ना वास्तविकता में कोई समस्या नहीं है, लेकिन ऐसा लगता है कि यह ऐसा है।


1
HTML WebSocket जैसी कोई चीज नहीं है। आपका मतलब HTTP WebSocket है।
लोर्न

जवाबों:


209

अधिकांश तरीकों से WebSockets शायद AJAX / HTML अनुरोधों से बेहतर होगा। हालाँकि, इसका मतलब यह नहीं है कि WebSockets AJAX / HTML के सभी उपयोगों के लिए एक प्रतिस्थापन है।

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

कभी एक साथ हजारों AJAX ग्राहकों के हजारों का समर्थन करने के लिए एक वेब सर्वर को कॉन्फ़िगर करने की कोशिश की? उन ग्राहकों को वेबसॉफ़्ट क्लाइंट में बदलें और यह अभी संभव हो सकता है।

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

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

  • आमतौर पर, HTTP सर्वर डिस्क और सीपीयू समय लेने वाले हर HTTP अनुरोध को शुरू करने और पूरा करने के लिए कॉन्फ़िगर किया जाता है। यह WebSockets डेटा की शुरुआत और पूर्णता को लॉग इन करने के लिए मानक बन जाएगा, लेकिन जब डुप्लेक्स ट्रांसफर करने वाले WebSockets कनेक्शन में कोई अतिरिक्त लॉगिंग ओवरहेड नहीं होगी (यदि ऐसा करने के लिए डिज़ाइन किया गया है तो एप्लिकेशन / सेवा को छोड़कर)।

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

  • उत्पादन के अधिकांश लोकप्रिय वेब सर्वरों में HTTP अनुरोधों को संभालने के लिए प्रक्रियाओं (या थ्रेड्स) का एक पूल है। दबाव बढ़ने पर पूल का आकार बढ़ जाएगा क्योंकि प्रत्येक प्रक्रिया / धागा एक समय में एक HTTP अनुरोध को संभालता है। प्रत्येक अतिरिक्त प्रक्रिया / थ्रेड अधिक मेमोरी का उपयोग करता है और नई प्रक्रियाएं / थ्रेड्स बनाना नए सॉकेट कनेक्शन (जो उन प्रक्रियाओं / थ्रेड्स को अभी भी करना है) बनाने की तुलना में काफी अधिक महंगा है। अधिकांश लोकप्रिय WebSockets सर्वर चौखटे घटना के रास्ते में जा रहे हैं जो बड़े पैमाने पर और बेहतर प्रदर्शन करते हैं।

WebSockets का प्राथमिक लाभ इंटरैक्टिव वेब अनुप्रयोगों के लिए कम विलंबता कनेक्शन होगा। यह HTTP AJAX / लंबे समय के सर्वेक्षण (एप्लिकेशन / सर्वर को ठीक से डिज़ाइन किया गया है) की तुलना में बेहतर पैमाने पर और कम सर्वर संसाधनों का उपभोग करेगा, लेकिन IMO कम विलंबता WebSockets का प्राथमिक लाभ है क्योंकि यह वेब अनुप्रयोगों के नए वर्गों को सक्षम करेगा जो संभव नहीं हैं AJAX / long-poll के वर्तमान ओवरहेड और विलंबता के साथ।

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

अपडेट :

उपयोगी लिंक: NWS.js का उपयोग करके AWS पर 600k समवर्ती वेबस्कैट कनेक्शन


4
विस्मयकारी आंसर। प्रतिक्रिया देने के लिए समय निकालने के लिए धन्यवाद।
रयान मॉन्टगोमरी

7
मैं अभी भी नहीं जानता कि एक बार जब आप दीवार से टकराते हैं, तो कैसे स्केल करें। यह सच है कि WebSockets कम संसाधनों का उपभोग करते हैं (वे लंबवत पैमाने पर हैं), लेकिन HTTP क्षैतिज रूप से स्केलिंग के लिए बहुत अच्छा है। मैं सैद्धांतिक रूप से असीम पैमाने पर सर्वर जोड़ सकता हूं। मैं हमेशा इस बात को लेकर उलझन में रहता हूं कि किसी एक बॉक्स की क्षमता का उपयोग करने के बाद कैसे स्केल किया जाए। विचार?
सीन क्लार्क हेस

6
@Sean। क्षैतिज रूप से स्केलिंग करने के लिए WebSockets जरूरी बदतर नहीं है। यह बस नए अनुप्रयोगों को खोलता है जो आवश्यक रूप से आसानी से स्केल नहीं करते हैं। उदाहरण के लिए, स्थैतिक डेटा की सेवा के लिए, WebSocket सर्वर का एक गुच्छा HTTP सर्वरों के एक समूह की तुलना में बस (या बेहतर) पैमाने पर होगा। परिवहन की परवाह किए बिना एक कम-विलंबता वास्तविक समय का खेल कठिन है (और यह वास्तव में HTTP का उपयोग करके संभव नहीं है)। असली सवाल यह है कि आप डेटा / एप्लीकेशन स्केल को कितनी अच्छी तरह समझते हैं। यदि वह तराजू है, तो HTTP बनाम वेबसॉकेट्स की आपकी पसंद अन्य कारकों पर आधारित होनी चाहिए: विलंबता, परिनियोजन विकल्प, ब्राउज़र समर्थन, आदि
kanaka

2
एक सुधार - एक टीसीपी कनेक्शन में गंतव्य आईपी और गंतव्य बंदरगाह होते हैं। इसका मतलब है कि ports 64 k पोर्ट की सीमा वास्तव में केवल एक ग्राहक के लिए है। सैद्धांतिक रूप से, सर्वर में किसी भी खुले कनेक्शन की संख्या हो सकती है, केवल उसके हार्डवेयर द्वारा सीमित।
Rizon

@ रीजन, यह सच है। मैंने उत्तर को अपडेट कर दिया है और ओपन पोर्ट लिमिटेशन को बदल दिया है और इसके बजाय फाइल डिस्क्रिप्टर लिमिटेशन का उल्लेख किया है, जो वह है जो लोग अक्सर पहले में चलाते हैं।
कनक

36

बस एक स्पष्टीकरण: क्लाइंट कनेक्शनों की संख्या जो सर्वर का समर्थन कर सकती है, उसका इस परिदृश्य में बंदरगाहों से कोई लेना-देना नहीं है, क्योंकि सर्वर [आमतौर पर] केवल एक ही पोर्ट पर WS / WSS कनेक्शन के लिए सुन रहा है। मुझे लगता है कि अन्य टिप्पणीकारों को संदर्भित करने के लिए फाइल डिस्क्रिप्टर का क्या मतलब था। आप फ़ाइल डिस्क्रिप्टर की अधिकतम संख्या को बहुत अधिक सेट कर सकते हैं, लेकिन फिर आपको प्रत्येक खुले टीसीपी / आईपी सॉकेट के लिए सॉकेट बफर आकारों को जोड़ना होगा। यहां कुछ अतिरिक्त जानकारी दी गई है: /server/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system

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


AFAIR में एक आने वाला पोर्ट है, लेकिन प्रत्येक कनेक्शन के लिए हमेशा एक आउटगोइंग पोर्ट खोला जाता है। यह C10k समस्या का केवल एक भाग विलेख में है
अरनौद बुचेज़

14

कोई भी आधुनिक सिंगल सर्वर हजारों क्लाइंट्स को एक साथ सर्वर करने में सक्षम है । इसका HTTP सर्वर सॉफ्टवेयर सिर्फ इवेंट-ड्रिवेन (IOCP) उन्मुख होना है (हम पुराने अपाचे में एक कनेक्शन = एक धागा / प्रक्रिया समीकरण किसी भी अधिक नहीं हैं)। यहां तक ​​कि विंडोज (HTTP.sys) में निर्मित HTTP सर्वर IOCP उन्मुख और बहुत ही कुशल (कर्नेल मोड में चल रहा है) है। इस दृष्टिकोण से, WebSockets और नियमित HTTP कनेक्शन के बीच स्केलिंग में बहुत अंतर नहीं होगा। एक टीसीपी / आईपी कनेक्शन एक छोटे संसाधन (एक थ्रेड से बहुत कम) का उपयोग करता है, और आधुनिक ओएस को कई समवर्ती कनेक्शनों को संभालने के लिए अनुकूलित किया जाता है: इस टीसीपी / आईपी विनिर्देशों से विरासत में प्राप्त वेबसूट और एचटीटीपी सिर्फ ओएसआई 7 अनुप्रयोग परत प्रोटोकॉल हैं।

लेकिन, प्रयोग से, मैंने वेबस्केट्स के साथ दो मुख्य समस्याएं देखी हैं:

  1. वे सीडीएन का समर्थन नहीं करते हैं;
  2. उनके पास संभावित सुरक्षा मुद्दे हैं।

तो मैं किसी भी परियोजना के लिए निम्नलिखित की सिफारिश करूंगा:

  • केवल ग्राहक सूचनाओं के लिए वेबस्केट्स का उपयोग करें (लंबे समय से मतदान के लिए एक बैकबैक तंत्र के साथ - आसपास बहुत सारे पुस्तकालय हैं);
  • कैश के लिए CDN या परदे के पीछे का उपयोग करके अन्य सभी डेटा के लिए RESTful / JSON का उपयोग करें।

व्यवहार में, पूर्ण WebSockets अनुप्रयोगों में अच्छी तरह से पैमाने नहीं हैं। बस वे क्या डिजाइन किए गए थे के लिए WebSockets का उपयोग करें: सर्वर से क्लाइंट के लिए सूचनाएं धक्का।

WebSockets के उपयोग की संभावित समस्याओं के बारे में:

1. CDN का उपयोग करने पर विचार करें

आज (लगभग 4 साल बाद), वेब स्केलिंग में कंटेंट डिलीवरी नेटवर्क (सीडीएन) फ्रंट एंड का उपयोग करना शामिल है, न केवल स्टैटिक कंटेंट (html, css, js) के लिए बल्कि आपके (JSON) एप्लिकेशन डेटा के लिए भी

बेशक, आप अपना सारा डेटा अपने सीडीएन कैश पर नहीं डालेंगे, लेकिन व्यवहार में, बहुत सारी सामान्य सामग्री अक्सर नहीं बदलेगी। मुझे संदेह है कि आपके REST संसाधनों का 80% कैश हो सकता है ... यहां तक ​​कि एक मिनट (या 30 सेकंड) CDN की समय सीमा समाप्ति समय आपके केंद्रीय सर्वर को एक नया लाइव देने के लिए पर्याप्त हो सकता है, और CDN के बाद से एप्लिकेशन की प्रतिक्रिया को काफी बढ़ा सकता है। भौगोलिक रूप से देखते रहें ...

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

2. सुरक्षा के मुद्दे

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

WebSockets किसी भी व्यावसायिक सुरक्षा में, OSI 7 एप्लिकेशन लेवल स्तर पर पैकेट निरीक्षण के किसी भी अवसर से बचते हैं, जो आजकल बहुत मानक है। वास्तव में, WebSockets संचरण को बाधित करता है, इसलिए सुरक्षा रिसाव का एक बड़ा उल्लंघन हो सकता है।


2
CDA पर अच्छे प्रदर्शन के लिए @ArnaudBouchez - +1। क्विक फॉलो अप सवाल - इवेंट डिलीवरी नेटवर्क की व्यवहार्यता से आप क्या समझते हैं? CDNs के बाद पैटर्न किया गया है, लेकिन वेबसैट या कुछ अन्य अभी तक अनदेखी तकनीक पर स्ट्रीमिंग डेटा इत्यादि देने के लिए तैयार है।
क्विक्सर

8

इसे इस तरह से सोचें: क्या सस्ता है, एक खुला कनेक्शन रखना, या हर अनुरोध के लिए एक नया कनेक्शन खोलना (ऐसा करने की बातचीत उपरि के साथ, यह टीसीपी याद है।)

बेशक यह आवेदन पर निर्भर करता है, लेकिन दीर्घकालिक रीयलटाइम कनेक्शन (जैसे AJAX चैट) के लिए कनेक्शन को खुला रखना कहीं बेहतर है।

सॉकेट के लिए अधिकतम संख्या में मुफ्त पोर्ट द्वारा कनेक्शन की अधिकतम संख्या को कैप किया जाएगा।


आप WebSocket का उपयोग किए बिना कनेक्शन को खुला रख सकते हैं (HTTP / 1.1 के जीवित विकल्प के लिए धन्यवाद)। मुझे यकीन नहीं है कि मैं आपकी बात यहाँ समझ सकता हूँ।
अरनौद बुचेज़

1
+1। लोग टीसीपी कनेक्शन की स्थापना को भूल जाते हैं, जिसमें एक सिंक / एकेक / एकेक शामिल होता है और टीएलएस को प्रमुख एक्सचेंज के लिए अधिक दौर की यात्राओं की आवश्यकता होती है।
क्विक्सर

1
@ArnaudBouchez check en.wikipedia.org/wiki/HTTP_persistent_connection#HTTP_1.1 WebSockets जब तक आप चाहते हैं तब तक खुले रहते हैं और Hackish (लंबे समय तक मतदान और अन्य विकल्प की तरह) नहीं होते हैं।
koD

-5

नहीं, यह पैमाना नहीं है, मध्यवर्ती मार्गों के स्विच को जबरदस्त काम देता है। तब सर्वर पर पृष्ठ दोष (आपको उन सभी डिस्क्रिप्टर को रखना पड़ता है) उच्च मूल्यों तक पहुंच रहे हैं, और कार्य क्षेत्र में संसाधन लाने का समय बढ़ता है। ये ज्यादातर JAVA लिखित सर्वर होते हैं और यह एक को नष्ट करने / बनाने के लिए सॉकेट के उन गजलों पर पकड़ बनाने के लिए तेज़ हो सकता है। जब आप ऐसे सर्वर को मशीन पर चलाते हैं तो कोई अन्य प्रक्रिया आगे नहीं बढ़ सकती।

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