2012-01-08 24 views
9

चिंताओं आप कई उपयोगकर्ताओं (& सर्वर) कैसे अपने WebSocket बुनियादी ढांचे (सर्वर [एस]) पैमाने पर होगा के साथ सेट एक जटिल आवश्यकता है, तो विशेष रूप से प्रसारण के साथ?WebSocket क्षमता, प्रसारण

बेशक

, प्रसारण किसी भी WebSocket कल्पना का हिस्सा नहीं है, लेकिन यह भी बुनियादी चैट उदाहरण (यानी नमस्ते WebSocket के लिए दुनिया) में है।

क्लाइंट साइड समाधान (नए डेटा के लिए पूछ) अभी भी WebSockets 'कम विलंबता और अपेक्षाकृत सस्ते (http headerless) प्रकृति के साथ सर्वर साइड (प्रसारण) समाधान की तुलना में अधिक विश्वसनीय लगता है।

संपादित करें:

ठीक है, लगता है कि आप जो भी हो सकता है WebSocket कार्यान्वयन के साथ अपने सभी ajax कोड बदलना चाहते हैं कि इतने सारे विभिन्न संदर्भों के भीतर इतने सारे कनेक्शन। यदि आप प्रसारण के लिए हर संभावित परिदृश्य का ट्रैक रखना चाहते हैं तो यह आपके सिस्टम में भारी जटिलता जोड़ता है।

कम (नेटवर्क/धागा आदि) के स्तर का कार्यान्वयन सुझाव क्योंकि इसका मतलब है कि आप सामान्य http सर्वर के विपरीत एक विशेष सर्वर कोड करने के लिए है, समस्या समाधान नहीं का हिस्सा भी हैं।

इसके अलावा, प्रसारण तालिका जो आसानी से पैमाने पर नहीं कर सकते करने के लिए स्टेटफुल प्रकृति के कुछ प्रकार लाता है। अधिक सर्वर जोड़ने और संतुलन लोड करने के बारे में सोचें।

उत्तर

15

वास्तविक समय वेब समाधान स्केलिंग एक जटिल समस्या है, लेकिन एक है कि Pusher जैसी सेवाओं (जो मैं के लिए काम करते हैं) को हल किया है, और एक वहाँ सबसे निश्चित रूप से self hosted realtime web solutions के लिए परिभाषित समाधान कर रहे हैं कि हो सकता है - PubSub paradigm अच्छी तरह से समझ रहा है और कई हल किया गया है समय और समस्या को हल करने के लिए कुछ राज्य होने की आवश्यकता है (जो किस चीज की सदस्यता ले रहे हैं)। इस प्रतिमान का उपयोग परिदृश्यों के प्रकारों को प्रसारित करने में किया जाता है जिनके बारे में आप बात कर रहे हैं। जमीन से कई -

Broadcasting diagram

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

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

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

वेबसॉकेट मतदान कुछ ऐसा है जो मैंने पहले नहीं माना है और मुझे नहीं लगता कि मैंने इसे पहले कहीं भी सुझाव दिया है; यह विचार कि क्लाइंट को यह कहना चाहिए कि "मैं अपने अगले डेटा के सेट के लिए तैयार हूं और यहां मैं जो चाहता हूं" एक दिलचस्प है। वेबसाकेट्स ने आम तौर पर अनुरोध/प्रतिक्रिया प्रतिमान से छलांग लगाई है लेकिन ऐसे परिदृश्य हो सकते हैं जहां वेबस्केट की बढ़ी हुई दक्षता और उनके द्वारा अनुरोध/प्रतिक्रिया का कुछ लाभ हो सकता है। SocketStream एप्लिकेशन ढांचा एक लायक हो सकता है क्योंकि यह प्रासंगिक हो सकता है; प्रारंभिक एप्लिकेशन लोड के बाद सभी संचार वेबस्केट्स पर किए जाते हैं जिसका अर्थ है कि ईवेंट मूल अनुरोध/प्रतिक्रिया कार्यक्षमता वेबस्केट का उपयोग करती है।

SocketStream logo

हालांकि, बाद से हम प्रसारण डेटा के बारे में बात कर रहे हैं हम वापस पबसब प्रतिमान पर जाने के लिए जहां यह जब नया डेटा उपलब्ध है कि नए डेटा उन लोगों के लिए वितरित किया जाता है और सक्रिय सदस्यता के लिए और अधिक समझ में आता है की जरूरत है सक्रिय सदस्यता (धक्का)। आपके सभी एप्लिकेशन को यह जानने की जरूरत है कि क्या कोई सक्रिय सदस्यता है या नहीं, यह तय करने के लिए कि डेटा प्रकाशित करना है या नहीं। वह समस्या हल हो गई है।

1

websockets का विचार यह है कि आप प्रत्येक ग्राहक के साथ लगातार संबंध रखते हैं। जब कोई नया डेटा होता है जिसे आप प्रत्येक ग्राहक को भेजना चाहते हैं, तो आप पहले से ही जानते हैं कि सभी ग्राहक कौन हैं इसलिए आपको इसे भेजना चाहिए।

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

क्यों न सिर्फ एक खुले वेबसाकेट कनेक्शन को स्थायी अनुरोध की तरह माना जाता है अधिक डेटा के लिए ग्राहक?

+2

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

+1

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

+0

आप लगभग सत्र और सॉकेट अवधारणाओं को मिला रहे हैं; पहला एक आवेदन स्तर है और बाद वाला नेटवर्क स्तर है जैसा आप जानते हैं। व्यवहार में आप उस गहरे जाना नहीं चाहते हैं, न ही मैं। आईएमएचओ, आवेदन स्तर में इस समस्या को सोचना बेहतर है। –

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