लोड हो रहा है वेब सॉकेट


104

मेरे पास एक सवाल है कि बैलेंस वेब सॉकेट को कैसे लोड किया जाए।

मेरे पास एक सर्वर है जो वेब सॉकेट का समर्थन करता है। ब्राउज़र मेरी साइट से जुड़ते हैं और हर एक वेब सॉकेट खोलता है www.mydomain.com। इस तरह, मेरा सोशल नेटवर्क ऐप ग्राहकों को संदेश भेज सकता है।

परंपरागत रूप से, केवल HTTP अनुरोधों का उपयोग करते हुए, मैं दो वेब सर्वरों के सामने एक दूसरा सर्वर और एक लोड बैलेंसर जोड़कर स्केल करूंगा।

वेब सॉकेट्स के साथ, कनेक्शन को सीधे वेब सर्वर के साथ होना चाहिए, न कि लोड बैलेंसरों के साथ, क्योंकि अगर किसी मशीन में 64k ओपन पोर्ट्स की एक भौतिक सीमा होती है, और क्लाइंट लोड बैलेंसर से जुड़ रहे थे, तो मैं समर्थन नहीं कर सकता था 64k से अधिक समवर्ती उपयोगकर्ता।

तो मैं कैसे -

  1. पेज लोड होने पर क्लाइंट को सीधे वेब सर्वर (लोड बैलेंसर के बजाय) से कनेक्ट करने के लिए मिलता है? क्या मैं केवल जावास्क्रिप्ट को एक नोड से लोड करता हूं, और लोड बैलेंसर्स (या जो भी) स्क्रिप्ट के लिए URL को यादृच्छिक रूप से संशोधित करता है, हर बार जब पृष्ठ शुरू में अनुरोध किया जाता है?

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

  3. मैंने शुरुआती अनुरोध पर रीडायरेक्ट भेजने वाले लोड बैलेन्सर के बारे में आश्चर्य किया, ताकि ब्राउज़र शुरू में अनुरोध करे www.mydomain.comऔर फिर से अप्रत्यक्ष हो जाए www34.mydomain.com। यह बहुत अच्छा काम करता है, जब तक कि नोड नीचे नहीं जाता है - और फेसबुक जैसी साइटें ऐसा नहीं करती हैं। वह यह कैसे करते हैं?


1
आप नेटवर्क लेयर पर बैलेंस लोड कर सकते हैं, जैसा कि यहाँ
क्रिस स्नो

1
DNS आधारित लोडबैलेंसिंग या http आधारित ऑर्केस्ट्रेशन सर्वर का उपयोग करने जैसे वैकल्पिक दृष्टिकोण भी हैं। मैं उर्ध्वप्रवाह और प्रत्येक दृष्टिकोण की कमियां पर संक्षेप में प्रस्तुत करने की कोशिश की है deepstream.io/blog/load-balancing-websocket-connections
wolframhempel

@wolframhempel लिंक मृत है। :-(
एमिल कॉर्मियर

जवाबों:


94

एक L3 लोड-बैलेंसर लगाएं जो आपके WebSocket सर्वर फ़ार्म पर source-IP-port हैश के आधार पर IP पैकेट वितरित करता है। चूंकि L3 बैलेंसर कोई राज्य नहीं रखता है (हैशेड स्रोत-आईपी-पोर्ट का उपयोग करके) यह कम-अंत हार्डवेयर पर तार की गति को मापता है (10GbE कहते हैं)। चूंकि वितरण नियतात्मक है (हैशेड स्रोत-आईपी-पोर्ट का उपयोग करके), यह टीसीपी (और इसलिए वेबस्केट) के साथ काम करेगा।

यह भी ध्यान दें कि एक 64k हार्ड सीमा केवल एक दिए गए (स्रोत) आईपी पते के लिए आउटगोइंग टीसीपी / आईपी पर लागू होती है । यह आने वाले टीसीपी / आईपी पर लागू नहीं होता है। हमने 2 कोर, 4 जीबी रैम वीएम पर 200k सक्रिय कनेक्शन के साथ ऑटोबान (एक उच्च-प्रदर्शन वेबसर्केट सर्वर) का परीक्षण किया है ।

यह भी ध्यान दें कि आप प्रारंभिक WebSocket हैंडशेक के दौरान घोषित HTTP पथ पर L7 लोड-बैलेंसिंग कर सकते हैं। उस स्थिति में लोड बैलेंसर को राज्य बनाए रखना है (कौन सा स्रोत आईपी-पोर्ट जोड़ी किस बैकेंड नोड में जा रही है)। यह शायद सभ्य सेटअप पर लाखों कनेक्शनों के पैमाने पर होगा।

डिस्क्लेमर: मैं ऑटोबान का मूल लेखक हूं और टैवेंडो के लिए काम करता हूं।


इसलिए मैं अपनी जावास्क्रिप्ट लाइब्रेरी को लोड बैलेंसर URL से लोड करूँगा और लोड बैलेंसर URL दे दूँगा जब मैं जावास्क्रिप्ट में वेब सॉकेट बनाऊंगा - आपका मतलब यह ब्राउज़र के लिए पारदर्शी है? वह शांत है!
जॉन स्मिथ

1
हां, केवल 1 URL है, और बाद वाले का होस्टनाम आपके लोड-बैलेंसर को हल करना चाहिए। WebSocket बैकएंड सर्वर में आंतरिक IP (सार्वजनिक नहीं) हैं, और वैकल्पिक रूप से जनता से अलग पोर्ट पर भी चल सकते हैं। एकमात्र चेतावनी यह है कि आपको WebSocket सर्वर को यह बताने की आवश्यकता हो सकती है कि उनके सार्वजनिक दृश्यमान होस्टनाम, IP, पोर्ट क्या है, क्योंकि अनुरूपता के आधार पर WebSocket सर्वर यह जाँचेंगे कि HTTP हेडर के HTTP हेडर में सप्लाई किया गया URL होस्टनाम / IP / पोर्ट को फिट करता है। सुन रहे हैं।
9

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

जब मैं जावा वेबस्केट में 5000 से अधिक कनेक्शन बनाता हूं तो यह मेमोरी को रिलीज नहीं करता है .... क्या कोई समाधान है?
पूनम पटेल

3

ध्यान दें कि यदि आपका वेबसोकेट सर्वर लॉजिक, सॉकेट.आईओ के साथ नोडज पर चलता है, तो आप सिंक्रोनाइज़ेशन के लिए शेयर्ड रेडिस की / वैल्यू स्टोर का उपयोग करने के लिए सॉकेट को बता सकते हैं। इस तरह से आपको लोड बैलेंसर के बारे में परवाह करने की ज़रूरत नहीं है, घटनाओं को सर्वर उदाहरणों के बीच प्रचारित किया जाएगा।

var io = require('socket.io')(3000);
var redis = require('socket.io-redis'); 
io.adapter(redis({ host: 'localhost', port: 6379 }));

देख : http://socket.io/docs/use-multiple-nodes/

लेकिन कुछ बिंदु पर मुझे लगता है कि रेडिस अड़चन बन सकता है ...


2

आप निरीक्षण और "राउटिंग कार्यक्षमता" के साथ परत 7 लोड संतुलन को भी प्राप्त कर सकते हैं

"Stingray ट्रैफिक मैनेजर का उपयोग करके वेबस्केट्स ट्रैफ़िक का निरीक्षण और लोड-संतुलन कैसे करें, और जब आवश्यक हो, उसी IP एड्रेस और पोर्ट पर प्राप्त होने वाले WebSockets और HTTP ट्रैफ़िक को कैसे प्रबंधित करें, देखें।" https://splash.riverbed.com/docs/DOC-1451


2
आपके द्वारा लिंक की गई जानकारी को खोजने के लिए मुझे कुछ स्लीथिंग करना था। वेबैक मशीन मुझे उस लेख के एक जीवित प्रति ढूंढने में मदद की: community.pulsesecure.net/t5/Pulse-Secure-vADC/...
Wyck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.