2012-11-13 11 views
15

मैं ईसी 2 पर Socket.io चलाने वाले नोडजेएस अनुप्रयोग सर्वरों का एक समूह स्थापित करने की योजना बना रहा हूं, और मैं उनके बीच लोड फैलाने के लिए Elastic Load Balancer का उपयोग करना चाहता हूं। मुझे पता है कि ईएलबी बॉक्स के बाहर Websockets का समर्थन नहीं करता है, लेकिन मैं here in Scenario 2 वर्णित सेटअप का उपयोग कर सकता हूं।सॉकेट.यो एक टीसीपी कॉन्फ़िगर किए गए वेबकैकेट पर अमेज़ॅन लोचदार लोड बैलेंसर

the blog post में बताया गया है, हालांकि, मुझे लगता है कि इस सेटअप कोई सत्र आत्मीयता या स्रोत आईपी जानकारी प्रदान करता है नोटिस:

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

क्या सॉकेट.io अभी भी इन परिस्थितियों में काम करेगा? या एसएसएल के साथ लोड बैलेंसर के पीछे सॉकेट.ओ ऐप सर्वर का एक सेट रखने का दूसरा तरीका है?

संपादित करें: टिम कैसवेल इस पहले से ही here करने के बारे में बात करता है। क्या कोई पोस्ट है यह बताते हुए कि इसे कैसे सेट किया जाए? फिर यहां कोई सत्र चिपचिपापन नहीं है, लेकिन चीजें ठीक काम कर रही हैं।

एक तरफ, चिपचिपा सत्र वास्तव में websockets के साथ आवश्यक हैं? क्या सूचना नए और अलग अनुरोधों के रूप में यात्रा करती है या क्या केवल एक अनुरोध + कनेक्शन है जो सभी जानकारी के साथ चलता है?

+0

त्वरित उत्तर - नहीं, socket.io काम नहीं करेगा यदि बाद के अनुरोध एक अलग सर्वर पर जाएंगे, तो आपको अपने सेटअप में "चिपचिपा" सत्र लागू करने का एक तरीका ढूंढना होगा। – Dmitry

+0

@ डिमिट्री: क्या आप निश्चित हैं? मुझे लगता है कि यदि आप एक साझा स्टोर का उपयोग करते हैं, तो सॉकेट.ओ को काम करना चाहिए, उदा। RedisStore? –

+0

@LinusGThiel यह चिपचिपा सत्र के बिना काम नहीं करेगा, यहां कुछ और विवरण हैं: https://groups.google.com/d/topic/socket_io/d9a8c49uymc/discussion – Dmitry

उत्तर

12

अब आप हाल ही में एडब्ल्यूएस द्वारा लॉन्च किए गए नए एप्लिकेशन लोड बैलेंसर का उपयोग कर सकते हैं।

एएलबी (एप्लिकेशन लोड बैलेंसर) के साथ ईएलबी (अब क्लासिक लोड बैलेंसर कहा जाता है) को प्रतिस्थापित करें और चिपचिपा सत्र सक्षम करें।

एएलबी वेब सॉकेट का समर्थन करता है। यह काम कर जाना चाहिए।

https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/

http://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html

+0

ईएलबी से दूर जाने और एएलबी का उपयोग करने के कोई गंभीर परिणाम हैं? सॉकेट.ओओ ने मेरे मामले में काम करना शुरू कर दिया, लेकिन मैं वास्तुकला में अन्य संभावित परिणामों के बारे में थोड़ा चिंतित हूं ... क्या ईएलबी पर एएलबी का उपयोग करने का कोई नकारात्मक पक्ष है? – user3766930

+1

@ user3766930 मुझे एएलबी में जाने के बाद से कोई समस्या नहीं आई है। पिछले छह महीनों से इसका इस्तेमाल कर रहे हैं। मेरे लिए ऐसा कोई नकारात्मक नहीं है। कोई वास्तुशिल्प समस्या नहीं है। –

+0

धन्यवाद आदमी, मैं अब तक का उपयोग कर रहा हूं, सब कुछ के लिए सॉकेट हैंडलिंग और ईएलबी के लिए एएलबी दोनों का उपयोग करने पर विचार कर रहा था, लेकिन मुझे यकीन नहीं है कि – user3766930

4

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

+0

तो सॉकेट.io ऐप के समान सर्वर पर http-प्रॉक्सी चल रहा है तो कोई समस्या नहीं होनी चाहिए? मैं चल रहे सर्वरों के सेट के बीच संतुलन के लिए ईएलबी का उपयोग करने की सोच रहा हूं (-> http-proxy -> socket.io) –

15

सॉकेट.ओसी एक टीसीपी ईएलबी के साथ भी बॉक्स से बाहर काम नहीं करता है क्योंकि यह websockets से कनेक्शन को अपग्रेड करने से पहले दो HTTP अनुरोध करता है।

पहला कनेक्शन प्रोटोकॉल स्थापित करने के लिए उपयोग किया जाता है, क्योंकि socket.io सिर्फ websockets से अधिक का समर्थन करता है।

GET /socket.io/1/?t=1360136617252 HTTP/1.1 
User-Agent: node-XMLHttpRequest 
Accept: */* 
Host: localhost:9999 
Connection: keep-alive 

HTTP/1.1 200 OK 
Content-Type: text/plain 
Date: Wed, 06 Feb 2013 07:43:37 GMT 
Connection: keep-alive 
Transfer-Encoding: chunked 

47 
xX_HbcG1DN_nufWddblv:60:60:websocket,htmlfile,xhr-polling,jsonp-polling 
0 

दूसरा अनुरोध वास्तव में कनेक्शन के उन्नयन के लिए प्रयोग किया जाता है:

GET /socket.io/1/websocket/xX_HbcG1DN_nufWddblv HTTP/1.1 
Connection: Upgrade 
Upgrade: websocket 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Key: MTMtMTM2MDEzNjYxNzMxOA== 
Host: localhost:9999 

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: 249I3zzVp0SzEn0Te2RLp0iS/z0= 

ऊपर दिए गए उदाहरण देख सकते हैं xX_HbcG1DN_nufWddblv अनुरोधों के बीच एक साझा महत्वपूर्ण है। यही समस्या है। ईएलबी राउंड-रॉबिन रूटिंग करते हैं, जिसका मतलब है कि अपग्रेड अनुरोध प्रारंभिक वार्ता में भाग लेने से पहले सर्वर को हिट करता है। इस प्रकार, सर्वर को पता नहीं है कि ग्राहक कौन है।

इन-मेमोरी स्टेटफुल डेटा डेटा-बैलेंसिंग का दुश्मन है। शुक्र है, socket.io इसके बजाय डेटा स्टोर करने के लिए Redis का उपयोग करने का समर्थन करता है। यदि आप अपने सर्वर को कई सर्वरों के साथ साझा करते हैं, तो वे अनिवार्य रूप से सभी ग्राहकों के सत्र साझा करते हैं।

रेडिस की स्थापना के विवरण के लिए socket.io wiki page देखें।

+0

ईएलबी राउंड रॉबिन करता है? ज़रुरी नहीं। यदि अनुरोध एक ही आईपी से आते हैं, तो उन्हें उसी सर्वर पर रीडायरेक्ट किया जाता है। जब मैंने परीक्षण लोड किया था तो यह एक समस्या है जिसे मैंने खोजा था। यही वजह है कि एडब्ल्यूएस ने वीपीसी के सामने प्रॉक्सी रखने का सुझाव दिया है। https://www.stackdriver.com/elb-affinity-problems/ http://harish11g.blogspot.fr/2012/07/aws-elastic-load-balancing-elb-amazon।एचटीएमएल (बिंदु 9) – mruellan

+0

क्या यह अभी भी मामला है? ईएलबी के पास चिपचिपापन का विकल्प है, क्या इससे समस्या हल हो सकती है? https://www.dropbox.com/s/scucxocqsw514ci/Screenshot%202014-03-31%2014.47.01.png – SteveEdson

+1

@SteveEdson ईएलबी के पास दुर्भाग्यवश टीसीपी चिपचिपापन का विकल्प नहीं है। –

0

जब आप एक बादल एक लोड संतुलन/रिवर्स प्रॉक्सी, राउटर आदि है कि में एक सर्वर चलाने के लिए, आपको उसे कॉन्फ़िगर करना ठीक से काम करने की जरूरत है, खासकर जब आप सर्वर को स्केल कई उदाहरणों का उपयोग करने के लिए।

सॉकेट.ओ, सॉकजेएस और इसी तरह के पुस्तकालयों में से एक बाधाओं में से एक यह है कि उन्हें सर्वर के उसी उदाहरण से लगातार बात करने की आवश्यकता है। जब सर्वर का केवल 1 उदाहरण होता है तो वे पूरी तरह से अच्छी तरह से काम करते हैं।

जब आप क्लाउड वातावरण में अपना ऐप स्केल करते हैं, तो लोड बैलेंसर (क्लाउड फाउंड्री के मामले में Nginx) खत्म हो जाएगा, और अनुरोध सॉकेट.ओ को तोड़ने के कारण विभिन्न उदाहरणों पर भेजे जाएंगे।

ऐसी स्थितियों में सहायता के लिए, लोड बैलेंसर्स में 'चिपचिपा सत्र' उर्फ ​​'सत्र एफ़िनिटी' नामक एक सुविधा है। मुख्य विचार यह है कि यदि यह प्रॉपर्टी सेट की गई है, तो पहले लोड-संतुलित अनुरोध के बाद, निम्नलिखित सभी अनुरोध एक ही सर्वर इंस्टेंस पर जाएंगे।

क्लाउड फाउंड्री में, कुकी-आधारित चिपचिपा सत्र कुकी jsessionid सेट करने वाले ऐप्स के लिए सक्षम हैं।

नोट: jsessionid कुकी नाम आमतौर पर जावा/स्प्रिंग अनुप्रयोगों में सत्रों को ट्रैक करने के लिए उपयोग किया जाता है। क्लाउड फाउंड्री बस सभी ढांचे के लिए चिपचिपा सत्र कुकी के रूप में इसे गोद ले रहा है।

तो, सभी ऐप्स को socket.io काम करने के लिए jsessionid नाम के साथ एक कुकी सेट करने की आवश्यकता है।

app.use (कुकीपार्सर); app.use (express.session ({store: sessionStore, key: 'jsessionid', गुप्त: 'आपका रहस्य यहाँ}});

एक्सप्रेस नाम jsessionid के साथ एक सत्र कुकी सेट:

तो ये कदम हैं। जब socket.io कनेक्ट होता है, तो वह उसी कुकी का उपयोग करता है और लोड बैलेंसर हिट करता है लोड बैलेंसर हमेशा उसी सर्वर पर रूट करता है जिसे कुकी सेट किया गया था। यदि आप एप्लिकेशन लोड बैलेंसर का उपयोग कर रहे हैं तो स्टिकी सत्र सेटिंग्स लक्ष्य पर है समूह स्तर

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