2017-03-13 9 views
7

Socket based event push architecture मैं एक सॉकेट सर्वर अनुप्रयोग नोड js पर लिखा, अमेज़न EBS (लचीला सेम डंठल) पर होस्ट की है जो लोड संतुलनसॉकेट कब ईएलबी पर, आवेदन सर्वर के सभी उदाहरणों से कनेक्ट करने की जरूरत है

ग्राहकों द्वारा किया जाता है सॉकेट से जुड़ता है और निर्दिष्ट आईडी पास करता है, event_id कहें कि मेरा एप्लिकेशन "event_ event_id" नाम के साथ कमरे बनाता है और कमरे में शामिल हो जाता है। अलग-अलग ग्राहकों से अलग "event_id" है

एक लैम्ब्डा समारोह में इस तरह के event_id

के रूप में आवश्यक डेटा के साथ आवेदन करने के लिए सॉकेट को जोड़ता है और "event_push" नाम की एक घटना का उत्सर्जन करता है जब भी मेरी सॉकेट आवेदन (में से एक मामले में EBS) event_id साथ एक धक्का घटना का पता लगाता है, यह कमरा "event_ event_id" के सभी सदस्यों को धक्का दे दिया डेटा, इस प्रकार सभी सदस्यों ईवेंट की सूचना दी हो जाता है

ग्राहकों सर्वर के किसी भी कनेक्ट कर सकते हैं, लोड संतुलन और द्वारा निर्णय लिया प्रसारण चिपचिपा सत्र कनेक्शन बनाए रख सकते हैं

अब मेरी समस्या: वहाँ में सर्वर के सभी उदाहरणों को एक घटना का उत्सर्जन के लिए एक रास्ता है: वहाँ केवल सर्वर एक कमरा "event_ event_id"

Qn नामित होने के लिए "event_push" फेंकना एक रास्ता है EBS? या क्यूएन: क्या कोई वैकल्पिक समाधान है?

+0

संभावित समाधान: एक केंद्रीय सदस्यता/प्रकाशित सर्वर जिसमें निरंतर कनेक्शन हो सकता है जो घटना विवरण प्राप्त कर सकता है। सॉकेट सर्वर केंद्रीय सर्वर की सदस्यता ले सकते हैं ताकि जब कभी कोई ईवेंट हो, लगातार कनेक्शन पर सभी सब्स्क्राइब किए गए सॉकेट सर्वर पर धक्का दिया जाएगा। – Ima

उत्तर

0

आप क्या कर सकते हैं आप Redis या mongoDb का उपयोग अपने मामले event_event_id में कुछ जानकारी सहेजने के लिए कर सकते हैं। आप उदाहरण नमूना दस्तावेज़

{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 1 
}, 
{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 2 
} 

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

ईवेंट को डिस्कनेक्ट करते समय आपको मोंगो या रेडिस से सॉकेट आईडी को हटाना होगा।

+0

1. मेरे सर्वर लास्टिक बीन डॉक द्वारा शुरू किए गए हैं, आप कभी नहीं जानते कि कौन सा सर्वर चालू है और कौन सा सर्वर डाउन है, या जब कोई नया सर्वर प्रारंभ होता है। इसलिए, इस परिदृश्य में सर्वर के बीच संचार प्रश्न से बाहर है। – Ima

+0

2. आप कभी भी नहीं जानते कि कौन सा उपयोगकर्ता किस सर्वर से कनेक्ट है, यह ब्राउज़र से सर्वर से सॉकेट कनेक्शन के बारे में है, कनेक्शन लगातार है, और ग्राहक (ब्राउज़र) 2 कारणों से किसी विशेष सर्वर से कनेक्शन स्थापित नहीं कर सकता है। ए) सर्वर हमेशा नहीं होते हैं, लेकिन ईबीएस और क्लाइंट (ब्राउजर) द्वारा प्रबंधित सर्वरों के बारे में कोई जानकारी नहीं है। बी) कनेक्शन लोचदार लोड बैलेंसर (ईएलबी) – Ima

+0

द्वारा निर्धारित किया जाता है इसके अलावा ईवेंट किसी भी उपयोगकर्ता या किसी अन्य इकाई तक ही सीमित नहीं हैं, इसलिए जैसा कि आपने सुझाव दिया है, मैं बाध्यकारी नहीं कर सकता। – Ima

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