स्केलिंग Node.js


86

मैं बड़े पैमाने पर सर्वर-साइड विकास के लिए काफी नया हूं। मैं Node.js का उपयोग करके एक सर्वर लिखना चाहता हूं, लेकिन इससे पहले कि मैं आगे जाऊं मैं जानना चाहता हूं कि नोड को स्केल करने के लिए सामान्य सिद्धांत क्या हैं, कहते हैं, प्रति सेकंड 20 प्रश्न।

मैं जो सेवा लिख ​​रहा हूं वह काफी हद तक एक डेटाबेस, प्लस प्रमाणीकरण और इनपुट डेटा के सत्यापन के लिए एक इंटरफ़ेस होगा।


"स्केलिंग नोड अप" से आपका क्या मतलब है? कई नोड प्रक्रिया शुरू?
थिलो

3
प्रति सेकंड 20 प्रश्न काफी कम है। Node.js को एक साथ हजारों कनेक्शनों को संभालने में सक्षम होना चाहिए। बस भारी लूप प्रसंस्करण मत करो क्योंकि यह पूरे दुभाषिया को अवरुद्ध करेगा। आपके उपयोग का मामला तुलनात्मक रूप से काफी हल्का होना चाहिए। नोड में, डेटाबेस कनेक्शन स्वचालित रूप से थ्रेड्स के लिए भेज दिए जाते हैं और जावास्क्रिप्ट स्तर पर अतुल्यकालिक रूप से नियंत्रित किए जाते हैं।
स्लीवेटमैन

जवाबों:


149

भार संतुलन

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

Nginx लोड संतुलन उदाहरण :

http {
  upstream myproject {
    server 127.0.0.1:8000 weight=3;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;    
    server 127.0.0.1:8003;
  }

  server {
    listen 80;
    server_name www.domain.com;
    location / {
      proxy_pass http://myproject;
    }
  }
}

Redis

प्रति सेकंड 20 प्रश्न

नोड.जेएस के लिए कोई पसीना नहीं आपको अपने डेटास्टोर के रूप में रेडिस का उपयोग करना चाहिए क्योंकि यह पागल है तेज :)। जब आप नोड_्रेडिस का उपयोग करते हैं, तब भी नोड के लिए एसी लाइब्रेरी होती है

npm install hiredis redis

हिरिसिस आपको किकैस प्रदर्शन देता है क्योंकि यह नोड के अंदर सी कोड को संकलित करता है। यहां रेडिस से कुछ बेंचमार्क हैं, जब हायरडिस के साथ उपयोग किया जाता है।

PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287

जब आप उन संख्याओं को देखते हैं तो 20 / s कुछ भी नहीं है :)।

प्रमाणीकरण


अपडेट करें:


मैं इसे बहुत कुछ बता रहा हूं लेकिन भगवान के प्यार के लिए कृपया अपने स्वयं के प्रमाणीकरण-प्रणाली को लागू करने की कोशिश न करें। यह शायद असुरक्षित होने वाला है (बहुत कुछ गलत हो सकता है), बहुत काम। प्रमाणीकरण के लिए आपको उत्कृष्ट कनेक्ट-ऑवर लाइब्रेरी का उपयोग करके फेसबुक-कनेक्ट, ट्विटर सिंगल साइन-इन आदि का उपयोग करना चाहिए । फिर आप सुरक्षित हैं क्योंकि उनके पास छेद के लिए लॉगिन-सिस्टम का परीक्षण करने वाले विशेषज्ञ हैं और सादे-पाठ के माध्यम से पासवर्ड भी संचारित नहीं करते हैं लेकिन ईश्वर के उपयोग के लिए धन्यवाद https। मैंने एक उपयोगकर्ता के लिए एक विषय का भी उत्तर दिया है जो फेसबुक-कनेक्ट का उपयोग करना चाहता था ।

इनपुट डेटा की मान्यता

इनपुट को मान्य करने के लिए आप नोड-सत्यापनकर्ता का उपयोग कर सकते हैं ।

var check = require('validator').check,
    sanitize = require('validator').sanitize

//Validate
check('test@email.com').len(6, 64).isEmail();       //Methods are chainable
check('abc').isInt();                               //Throws 'Invalid integer'
check('abc', 'Please enter a number').isInt();      //Throws 'Please enter a number'
check('abcdefghijklmnopzrtsuvqxyz').is(/^[a-z]+$/);

//Sanitize / Filter
var int = sanitize('0123').toInt();                  //123
var bool = sanitize('true').toBoolean();             //true
var str = sanitize(' \s\t\r hello \n').trim();      //'hello'
var str = sanitize('aaaaaaaaab').ltrim('a');        //'b'
var str = sanitize(large_input_str).xss();
var str = sanitize('&lt;a&gt;').entityDecode();     //'<a>'

प्रपत्र बनाने में आपकी सहायता करने के लिए यह प्रपत्र लायब्रेरी भी है ।


1
@ आपका स्वागत है आपका :)। विशेष रूप से याद रखें कि अपना स्वयं का लॉगिन-सिस्टम नहीं लिखना;) इसके अलावा जेफ एटवुड (स्टैकओवरफ़्लो लेखक) दृढ़ता से इसके खिलाफ सलाह देते हैं! => blog.stackoverflow.com/2010/04/openid-one-year-later
अल्फ्रेड

10
आप वेबसॉफ़्ट को लोड संतुलन के लिए HAProxy का उपयोग कर सकते हैं क्योंकि nginx काम नहीं करेगा :) यह आपको ऐसे एप्लिकेशन विकसित करने की सुविधा प्रदान करता है जिसके लिए आपको कहीं और WebSockets का उपयोग करने की आवश्यकता होती है! @ अल्फ्रेड के पहले ही भयानक जवाब के लिए एक अतिरिक्त।
श्रीपाद कृष्ण

5
एक उदाहरण HAProxy सेटअप, यदि आप वेबसोकेट का उपयोग करते हैं: stackoverflow.com/questions/4360221/…
Shripad Krishna

9
अच्छा उत्तर। मैं दृढ़ता से हर पासपोर्ट पर पासपोर्ट की अनुशंसा करता हूं।
उपराष्ट्रपति

1
क्या हर पासपोर्ट के बजाय पासपोर्ट के बारे में?
चॉवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.