2012-02-02 16 views
28

कैप्लिन जैसे कई धूमकेतु कार्यान्वयन सर्वर स्केलेबल समाधान प्रदान करते हैं।सर्वर स्केलेबिलिटी - एचटीएमएल 5 वेबसाइकिल बनाम धूमकेतु

बाद Caplin साइट से आंकड़ों में से एक है:

केपलिन मुक्तिदाता का एक उदाहरण से भी कम समय 7ms औसत विलंबता के साथ 100,000 ग्राहकों प्रति सेकंड प्रत्येक प्राप्त 1 संदेश का समर्थन कर सकते हैं।

किसी भी वेबसर्वर पर एचटीएमएल 5 websockets की तुलना करने के लिए यह कैसे करता है? क्या कोई मुझे किसी भी HTML 5 websockets आंकड़ों पर इंगित कर सकता है?

+0

आपका कैप्लिन लिंक टूटा हुआ है। – kanaka

+1

'एचटीएमएल 5 वेबसाइकिल बनाम धूमकेतु' पर एक टिप्पणी: जैसा कि कैप्लिन के लिबरेटर के नीचे अन्य टिप्पणियों में बताया गया है, कई अन्य 'धूमकेतु' सर्वरों के साथ, वेबसाकेट को कनेक्शन तंत्र के रूप में समर्थन देता है। सर्वर कब धूमकेतु सर्वर बनता है? यदि यह वेबसाकेट्स का उपयोग करता है तो यह अभी भी एक धूमकेतु सर्वर है? क्या धूमकेतु HTTP-Long मतदान और HTTP स्ट्रीमिंग के लिए छतरी शब्द है? मैं पढ़ने की सिफारिश करता हूं [धूमकेतु की मौत की अफवाहें बेहद अतिरंजित हो गई हैं] (http://blog.caplin.com/2009/12/17/the-rumours-of-comets-death-have-been-greatly-exaggerated /)। – leggetter

+1

मैं इसे अभी के लिए एक टिप्पणी के रूप में रखने जा रहा हूँ। लेकिन आपको वास्तव में एक विकल्प के रूप में EventSource (उर्फ सर्वर-प्रेषित घटनाक्रम) पर विचार करना चाहिए। यह कई सर्वरों को स्केलिंग बहुत आसान बनाता है क्योंकि यह यूनिडायरेक्शनल (केवल पुश-केवल) है। – igorw

उत्तर

6

यह जानना मुश्किल है कि यह किसी भी चीज़ की तुलना में कैसे होता है क्योंकि हम नहीं जानते कि (औसत) पेलोड आकार कितना बड़ा है। हुड के तहत (जैसे सर्वर को कार्यान्वित किया जाता है), HTTP स्ट्रीमिंग और websockets लगभग समान हैं - प्रारंभिक हैंडशेक के अलावा जो HTTP के साथ स्पष्ट रूप से किया जाता है।

यदि आपने सी (अला कैप्लिन) में अपना स्वयं का वेबस्केट सर्वर लिखा है, तो आप शायद उन संख्याओं तक पहुंच सकते हैं बिना बहुत कठिनाई के। अधिकांश वेबस्केट कार्यान्वयन मौजूदा सर्वर पैकेज (जेटी की तरह) के माध्यम से किए जाते हैं, इसलिए तुलना वास्तव में उचित नहीं होगी।

कुछ मानक:
http://webtide.intalio.com/2011/09/cometd-2-4-0-websocket-benchmarks/
http://webtide.intalio.com/2011/08/prelim-cometd-websocket-benchmarks/

हालांकि, अगर आप सी घटना lib मानक को देखो, libev और libevent की तरह, संख्या काफी sexier देखो:
http://libev.schmorp.de/bench.html

+3

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

+2

विलंबता, सर्वर से क्लाइंट को संदेश देने के संदर्भ में, प्रारंभिक कनेक्शन के बाद समान नहीं होने पर बहुत समान होगा। वेबकॉकेट लाभ, जैसा कि @ कानाका बताते हैं, यह है कि कनेक्शन स्थापित होने के बाद चैनल पूर्ण-डुप्लेक्स और द्वि-दिशात्मक है। इसलिए, यदि आप HTTP स्ट्रीमिंग का उपयोग करके द्वि-दिशात्मक संदेश को बेंचमार्क करना चाहते हैं, जहां क्लाइंट के लिए सर्वर शॉर्ट्स के लिए दूसरा शॉर्ट-लाइव HTTP आवश्यक है, तो वेबसॉकेट कनेक्शन के विरुद्ध वेबसॉकेट विकल्प काफी बेहतर होने की संभावना है। कैप्लिन अब वेबस्केट समर्थन प्रदान करते हैं, इसलिए मुझे विश्वास है कि वे 100k कनेक्शन को हरा सकते हैं। – leggetter

+1

@leggetter, मेरी समझ यह है कि HTTP/1.0 पर लंबे मतदान के साथ आपके पास दोनों दिशाओं में सॉकेट सेटअप और HTTP अनुरोध/प्रतिक्रिया शीर्षलेख हैं। रखरखाव के साथ HTTP/1.1 पर लंबे समय तक पूल सॉकेट को फिर से उपयोग करने की अनुमति देता है, लेकिन मेरी समझ यह थी कि HTTP अनुरोध/प्रतिक्रिया शीर्षलेख अभी भी भेजे/प्राप्त किए गए हैं।मुझे इससे अधिक कठिन लगता है कि मुझे इसके लिए एक ठोस जवाब मिलना चाहिए। मुझे विभिन्न धूमकेतु/AJAX/लंबे मतदान समाधानों की तुलना में तार डंप में बहुत दिलचस्पी होगी ताकि मैं देख सकूं कि वास्तव में क्या हो रहा है। – kanaka

8

सिद्धांत रूप में , वेबसाकेट HTTP से काफी बेहतर स्केल कर सकते हैं लेकिन कुछ चेतावनी भी हैं और उन चेतावनियों को संबोधित करने के कुछ तरीके भी हैं।

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

उत्कृष्ट जेट्टी बेंचमार्क लिंक @ दाऊद Titarenco के जवाब (1, 2) में तैनात पता चलता है कि WebSockets आसानी से परिमाण बेहतर विलंबता के आदेश की तुलना में अधिक प्राप्त कर सकते हैं जब धूमकेतु की तुलना में।

वेबस्केट बनाम HTTP के स्केलिंग के बारे में अधिक जानकारी के लिए this answer देखें।

चेतावनियां:

  • WebSocket कनेक्शन लंबे समय से रहते थे HTTP कनेक्शन जो अल्पकालिक हैं के विपरीत है। यह ओवरहेड को कम करता है (प्रत्येक अनुरोध/प्रतिक्रिया के लिए कोई सॉकेट निर्माण और प्रबंधन नहीं), लेकिन इसका मतलब यह है कि 64k अलग-अलग क्लाइंट होस्टों के ऊपर एक सर्वर को स्केल करने के लिए आपको उसी सर्वर पर एकाधिक आईपी पते जैसे चाल का उपयोग करने की आवश्यकता होगी।

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

+3

HTTP स्ट्रीमिंग (कैप्लिन का उपयोग करता है) में, HTTP हैंडशेक प्रत्येक संदेश नहीं होता है - मैंने इसे कई बार लागू किया है। यह अनिवार्य रूप से सिर्फ एक खुला (एक दिशात्मक) सॉकेट कनेक्शन है। HTTP स्ट्रीमिंग प्रदर्शन WebSockets के लिए बहुत तुलनीय होगा (लेकिन कई चेतावनी हैं, जिनमें से एक डुप्लेक्स की कमी है)। –

+3

कैप्लिन अब वेबसॉकेट समर्थन प्रदान करते हैं। HTTP स्ट्रीमिंग एक अच्छा विकल्प है (जैसा कि हमने दोनों ने कहा है) लेकिन ऐसे ब्राउज़र के साथ जो 'मल्टीपार्ट/एक्स-मिश्रित-प्रतिस्थापन' (फ़ायरफ़ॉक्स के अलावा अन्य सभी चीज़ों) की सामग्री-प्रकार का समर्थन नहीं करते हैं, इसका अर्थ है 'XHR.responseText 'बढ़ता जा रहा है और किसी बिंदु पर स्ट्रीमिंग कनेक्शन को गिरा दिया जाना चाहिए और फिर से शुरू किया जाना चाहिए या ब्राउज़र आखिरकार स्मृति से बाहर हो जाएगा। – leggetter

+0

@ डेविड टिटारेन्को, मुझे आपकी राय में दिलचस्पी होगी कि क्यों धूमकेतु विलंबता आयाम के लगभग ** 2 आदेश ** ** उस बेंचमार्क में धूमकेतु/लंबे मतदान बनाम वेबसॉकेट के लिए अलग हैं। – kanaka

42

प्रकटीकरण - मैं कैप्लिन के लिए काम करता हूं।

इस पृष्ठ पर गलत सूचना का एक सा तो मैं कोशिश करते हैं और यह स्पष्ट करने ..

मुझे लगता है कि हम तीन शिविरों में तरीकों के बारे में हम बात कर रहे हैं अलग कर सकता है करना चाहते हैं ..

  1. धूमकेतु HTTP मतदान - लंबी मतदान सहित
  2. धूमकेतु HTTP स्ट्रीमिंग - ग्राहक संदेशों के लिए सर्वर प्रारंभिक सेटअप
  3. धूमकेतु WebSocket के बाद कोई HTTP हेडर भूमि के ऊपर के साथ एक एकल लगातार सॉकेट का उपयोग करें - एक द्विदिश सॉकेट

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

जहां तक ​​प्रदर्शन का संबंध है, अधिकांश मानक सर्वर पर क्लाइंट संदेशों पर ध्यान केंद्रित करते हैं - उपयोगकर्ताओं की संख्या, प्रति सेकंड संदेशों की संख्या, और उन संदेशों की विलम्ब। इस परिदृश्य के लिए HTTP स्ट्रीमिंग और वेबसॉकेट के बीच कोई मौलिक अंतर नहीं है - दोनों खुले सॉकेट के नीचे संदेश लिख रहे हैं जिनमें बहुत कम या कोई हेडर या ओवरहेड नहीं है।

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

मुझे लगता है कि किसी ने HTTP KeepAlive पर स्पर्श किया है। यह स्पष्ट रूप से लंबे मतदान में सुधार कर सकता है - आपके पास अभी भी राउंडट्रिप और हेडर का ओवरहेड है, लेकिन हमेशा सॉकेट निर्माण नहीं होता है।

जहां वेबस्केट को उन परिदृश्यों में HTTP स्ट्रीमिंग पर सुधार करना चाहिए जहां सर्वर संदेशों के लिए अधिक क्लाइंट हैं। इन परिदृश्यों को वास्तविक दुनिया में जोड़ने से सरलता की तुलना में थोड़ा अधिक मनमाने ढंग से सेटअप होते हैं, 'बहुत से ग्राहकों को बहुत सारे संदेश भेजते हैं' जिन्हें हर कोई समझ सकता है। उदाहरण के लिए, एक व्यापारिक अनुप्रयोग में, एक परिदृश्य बनाते हैं जहां आप ट्रेडों को निष्पादित करने वाले उपयोगकर्ता (यानी सर्वर संदेशों के लिए क्लाइंट) शामिल करते हैं, लेकिन परिणाम क्लाइंट परिदृश्यों के मूल सर्वर से थोड़ा कम सार्थक होते हैं। व्यापारी 100 ट्रेड/सेकेंड करने की कोशिश नहीं कर रहे हैं - इसलिए आप '10000 उपयोगकर्ताओं को 100 संदेश/सेकंड प्राप्त करते समय' हर 5 मिनट में क्लाइंट संदेश भेजते समय परिणाम के साथ समाप्त होते हैं। ' क्लाइंट के लिए सर्वर संदेश के लिए अधिक दिलचस्प हिस्सा विलंबता है, क्योंकि आवश्यक संदेशों की संख्या आमतौर पर सर्वर से क्लाइंट संदेशों की तुलना में महत्वहीन होती है।

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

+0

+1, ठीक वही जो मैं अपनी पिछली टिप्पणियों में संदर्भित कर रहा था। HTTP स्ट्रीमिंग और वेबसाकेट्स का कार्यान्वयन कार्यात्मक रूप से समान है, लेकिन आप WebSockets की पूर्ण डुप्लेक्स क्षमता खो देते हैं। लंबी मतदान और लघु मतदान वेबस्केट्स के साथ वास्तव में उचित तुलना नहीं है क्योंकि कनेक्शन लगातार शुरू होता है। –

4

मतदान के किसी भी रूप है, जो के रूप में कहीं और बताया गया है, विलंबता लागू कर सकते हैं जब अद्यतन की दर ऊंची है की अनदेखी करते हुए तीन जावास्क्रिप्ट स्ट्रीमिंग के लिए सबसे आम तकनीक हैं:

  1. WebSocket
  2. धूमकेतु एक्सएचआर/XDR स्ट्रीमिंग
  3. धूमकेतु हमेशा के लिए IFrame

WebSocket दूर साफ समाधान कर रहा है, लेकिन अभी भी ब्राउज़र और नेटवर्क बुनियादी ढांचे के मामले में मुद्दे नहीं हैं इसका समर्थन जितनी जल्दी इसे बेहतर पर भरोसा किया जा सकता है।

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

इस समय हमारे उत्पाद my-Channels Nirvana के लिए कुछ और WebSocket benchmark graphs हैं।

पृष्ठ पर अंतिम ग्राफ (जावास्क्रिप्ट उच्च अद्यतन दर) के लिए नीचे पिछले बहुस्त्र्पीय और बाइनरी डेटा रेखांकन जाएं

सारांश में - परिणाम निर्वाण WebSocket 50 घटनाओं पहुंचाने दिखाने/सेकंड 800 माइक्रोसेकंड के साथ उपयोगकर्ताओं को 2,500k को विलंबता। 5,000 उपयोगकर्ताओं (कुल 250k घटनाओं/सेकंड स्ट्रीम) पर विलंबता 2 मिलीसेकंड है।

संबंधित मुद्दे