2012-11-13 65 views
6

कैसे डिज़ाइन करें मुझे लगता है कि मुझे एक ऐसे वेब एप्लिकेशन को लागू करने की आवश्यकता है जिसमें समवर्ती उपयोगकर्ताओं की उच्च मात्रा होगी। मैं node.js का उपयोग करने का फैसला करता हूं क्योंकि यह बहुत अच्छी तरह से स्केल करता है, इसमें अच्छा प्रदर्शन, ओपन सोर्स समुदाय इत्यादि है। फिर, बाधाओं से बचने के लिए, क्योंकि मुझे एक ही घटना में उपयोगकर्ताओं के गैज़िलियन मिल सकते हैं, मैं क्लस्टर का उपयोग करने का निर्णय लेता हूं मल्टी-कोर सीपीयू का लाभ लेने के लिए प्रक्रियाएं। इसके अलावा, मेरे पास 3 मशीनें हैं (मुख्य + 2) क्योंकि मुझे कैसंद्रा के साथ बड़े डेटा में हेरफेर करने की आवश्यकता है। बहुत बढ़िया, इसका मतलब है कि मेरे पास 3 * n node.js प्रक्रियाएं हैं जहां n cpu के कोर की संख्या है (मशीन समान हैं)।एक वितरित node.js वेब सर्वर

ठीक है, तो मैं एक शोध शुरू करते हैं और मैं निम्नलिखित स्कीमा के साथ समाप्त:

  • Nginx पोर्ट 80 पर सुनने और केवल इस्तेमाल किया स्थिर सामग्री (img, सीएसएस, जे एस, आदि) की सेवा के लिए।
    आगे बढ़ने के लिए गतिशील यातायात। मुझे पता है कि nginx को कैसे कॉन्फ़िगर करना है, लेकिन मुझे अभी भी हैप्रोक्सी को देखना है, इसलिए मैं कहूंगा कि हैपरॉक्स पोर्ट 4000 पर सुन रहा है। मुख्य मशीन (प्रवेश बिंदु) में Nginx और haproxy स्थापित हैं।
  • 3 मशीनों के बीच हैप्रोक्सी लोड संतुलन। यह बंदरगाह 4001 के लिए यातायात अग्रेषित करता है, कि है, Node.js प्रक्रियाओं n प्रक्रियाओं का एक समूह 4001.

को सुनने गया है 4001.

  • हर Node.js को सुन रहे हैं, तो मैं सही एक भी कर रहा हूँ http अनुरोध को एक एकल node.js प्रक्रिया में अग्रेषित किया जाएगा।

    एक सत्र बनाना काफी सामान्य है, है ना? एक सत्र सिर्फ एक नक्शा है, और यह नक्शा एक वस्तु है, और यह वस्तु node.js प्रक्रिया में रहती है। हैप्रोक्सी को राउंड-रॉबिन शेड्यूलर के साथ कॉन्फ़िगर किया जाएगा, इसलिए उसी उपयोगकर्ता को विभिन्न node.js प्रक्रियाओं में अग्रेषित किया जा सकता है। मैं सभी node.js प्रक्रियाओं में एक ही सत्र ऑब्जेक्ट को कैसे साझा कर सकता हूं? मैं एक वैश्विक वस्तु कैसे साझा कर सकता हूं (इसमें एक ही मशीन (नोड.जेएस क्लस्टर) और नेटवर्क में शामिल है)? मुझे वितरित वेब ऐप को node.js के साथ कैसे डिज़ाइन करना चाहिए? क्या कोई मॉड्यूल है जो सिंक्रनाइज़ेशन कार्यों को कम करता है?

  • +1

    हैप्रोक्सी में चिपचिपा सत्रों को संभालने के कई तरीके हैं, http: // stacko verflow.com/questions/6498030/load-balancing-haproxy-or-other-sticky-sessions। वैश्विक वस्तु के लिए, रेडिस या कुछ का उपयोग करें। – numbers1311407

    +0

    http://stackoverflow.com/questions/5398209/scaling-node-js-across-multiple-cores-servers के समान ही 3 सर्वर भी। –

    उत्तर

    1

    आप सत्र वस्तुओं को संग्रहीत करने के लिए memcache या redis का उपयोग कर सकते हैं। यह नोड प्रक्रियाओं को पुनरारंभ करने के मामले में काफी उपयोगी है (यदि सत्र डेटा प्रक्रिया में संग्रहीत है 'स्मृति यह खो जाएगा)।

    इसके अलावा आप pm2 सुविधा सूची का निरीक्षण कर सकते हैं और शायद उनमें से कुछ आपके लिए उपयोगी होंगे।

    बिल्डिंग माइक्रो-सर्विसेज आर्किटेक्चर अच्छी स्केलेबिलिटी बनाएगा।

    1

    जैसा कि इवान ने बताया, आप अपने सत्र ऑब्जेक्ट्स को मेमकेचे या रेडिस या यहां तक ​​कि कॉचबेस (मेमकेचे बाल्टी) में स्टोर करते हैं। यदि आप स्केलेबल सिस्टम बनाना चाहते हैं, तो मैं भी जोड़ना चाहूंगा, आपका लक्ष्य सिस्टम को इस तरह से बनाना चाहिए कि आप मांग के आधार पर थ्रूपुट बढ़ाने के लिए रैखिक रूप से स्केल कर सकें। इसका मतलब है कि, मांगों को संभालने के लिए आपको अपने बुनियादी ढांचे के भीतर किसी भी समय (अधिमानतः चोटी के दौरान) अधिक मेजबान जोड़ने में सक्षम होना चाहिए।

    तो आपको विकास के दौरान जो डिजाइन चुनते हैं और डिजाइन निर्णय लेने में आपको बहुत सावधान रहना होगा।

    मान लीजिए मुझे एक ऐसे वेब एप्लिकेशन को लागू करने की आवश्यकता है जिसमें समवर्ती उपयोगकर्ताओं की उच्च मात्रा होगी।

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

    एक स्केलेबल सिस्टम बनाने के दौरान एक अच्छा लिटमस परीक्षण खुद से पूछना है, "क्या विफलता का एक बिंदु है?" यदि हां तो आपका सिस्टम स्केल नहीं करेगा।

    0

    जैसा कि एक अन्य उपयोगकर्ता ने सुझाव दिया है; Redis का उपयोग इस समस्या का एक पूरी तरह से स्वीकार्य समाधान है।

    इसका कमजोर सत्र ऑब्जेक्ट्स संग्रहीत करने के लिए सेवा का उपयोग करना है और मिडलवेयर को और सब कुछ ख्याल रखना है। जैसा कि पहले उल्लेख किया गया है, यह नोड प्रक्रिया को पुनरारंभ करने, क्रैश करने आदि के मामलों में उपयोगी है। नोड प्रक्रिया में सत्र डेटा संग्रहीत करने से जोखिम होता है। माइक्रो सेवाओं (जैसे रेडिस) का उपयोग करने के लाभों में से एक यह है कि वे जोखिम कम हो जाते हैं।

    मान लें कि आप अपने मिडलवेयर के लिए Express का उपयोग करते हैं, तो आप Session store नामक किसी चीज़ का उपयोग कर सकते हैं। ऐसे मॉड्यूल हैं जो इस सुविधा का लाभ उठाते हैं। ,

    var session = require('express-session') 
    var RedisStore = require('connect-redis')(session) 
    
    app.use(session({ 
        store: new RedisStore(options), 
        secret: 'keyboard cat' 
    })) 
    

    अब आप अपने सत्र वस्तु का उपयोग करें:

    npm install connect-redis express-session 
    


    तो फिर तुम यह इतना तरह का प्रयोग करेंगे:

    एक ऐसी मॉड्यूल connect-redis

    स्थापना हमेशा की तरह एक हवा है जैसा कि आप सामान्य रूप से करेंगे। (req.session)


    उदाहरण:

    (उदाहरण के लिए एक फार्म के पद से,) सत्र जानकारी सेट करने के लिए:

    req.session.email = req.body.email 
    


    सत्र में जानकारी प्राप्त करने के लिए:

    console.log(req.session.email)