การปรับขนาด Node.js


86

ฉันค่อนข้างใหม่สำหรับการพัฒนาฝั่งเซิร์ฟเวอร์ขนาดใหญ่ ฉันต้องการเขียนเซิร์ฟเวอร์โดยใช้ Node.js แต่ก่อนที่ฉันจะก้าวไปข้างหน้าฉันต้องการทราบว่าหลักการทั่วไปสำหรับการปรับขนาดโหนดได้ถึง 20 คำค้นหาต่อวินาที

บริการที่ฉันเขียนส่วนใหญ่จะเป็นอินเทอร์เฟซไปยังฐานข้อมูลรวมถึงการพิสูจน์ตัวตนและการตรวจสอบความถูกต้องของข้อมูลอินพุต


"การปรับขนาดโหนดขึ้น" หมายความว่าอย่างไร เริ่มต้นกระบวนการหลายโหนด?
Thilo

3
20 คำค้นหาต่อวินาทีค่อนข้างต่ำ Node.js ควรสามารถรองรับการเชื่อมต่อพร้อมกันหลายพันรายการ เพียงแค่อย่าทำการประมวลผลแบบวนซ้ำเพราะมันจะปิดกั้นล่ามทั้งหมด กรณีการใช้งานของคุณควรมีน้ำหนักเบาพอสมควรเมื่อเปรียบเทียบ ใน Node การเชื่อมต่อฐานข้อมูลจะถูกสร้างไปยังเธรดโดยอัตโนมัติและจัดการแบบอะซิงโครนัสที่ระดับจาวาสคริปต์
slebetman

คำตอบ:


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 คำค้นหาต่อวินาที

ไม่มีเหงื่อสำหรับ node.js คุณควรใช้ redis เป็นที่เก็บข้อมูลของคุณเพราะมันเร็วมาก :) มีห้องสมุด AC แม้สำหรับโหนดเมื่อคุณใช้เป็นnode_redis

npm install hiredis redis

Hiredis เป็นสิ่งที่ให้ประสิทธิภาพการทำงานของ kickass เนื่องจากรวบรวมเป็นรหัส C ภายในโหนด ต่อไปนี้คือเกณฑ์มาตรฐานบางส่วนจาก redis เมื่อใช้กับ hireis

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 ก็ไม่มีอะไร :)

การรับรองความถูกต้อง


อัปเดต:


ฉันบอกเรื่องนี้มาก แต่เพื่อความรักของพระเจ้าโปรดอย่าพยายามใช้ระบบพิสูจน์ตัวตนของคุณเอง มันอาจจะไม่ปลอดภัย (ผิดพลาดได้มาก) งานเยอะ สำหรับการตรวจสอบสิทธิ์คุณควรใช้ facebook-connect, twitter single sign-in เป็นต้นโดยใช้ไลบรารีconnect-auth ที่ยอดเยี่ยม จากนั้นคุณจะปลอดภัยเพราะมีผู้เชี่ยวชาญทดสอบระบบล็อกอินสำหรับรูและยังไม่ส่งรหัสผ่านผ่านข้อความธรรมดา แต่ขอขอบคุณพระเจ้าที่ใช้ https ฉันยังได้ตอบหัวข้อสำหรับผู้ใช้ที่ต้องการที่จะใช้Facebook เชื่อมต่อ

การตรวจสอบความถูกต้องของข้อมูลอินพุต

การป้อนข้อมูลการตรวจสอบคุณสามารถใช้โหนดตรวจสอบ

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
@nornagon ยินดีต้อนรับครับ :). โดยเฉพาะอย่าลืมเขียนระบบล็อกอินของคุณเอง;) นอกจากนี้ Jeff Atwood (ผู้เขียน Stackoverflow) ขอแนะนำอย่างยิ่งกับมัน! => blog.stackoverflow.com/2010/04/openid-one-year-later
Alfred

10
คุณสามารถใช้ HAProxy ในการทำ WebSockets ให้สมดุลได้เนื่องจาก nginx จะไม่ทำงาน :) นี่คือหากคุณกำลังพัฒนาแอปพลิเคชันที่ต้องการให้คุณใช้ WebSockets ที่ไหนสักแห่ง! นอกจากคำตอบที่ยอดเยี่ยมแล้วของ @ alfred
Shripad Krishna

5
ตัวอย่างการตั้งค่า HAProxy ในกรณีที่คุณใช้ websockets: stackoverflow.com/questions/4360221/…
Shripad Krishna

9
คำตอบที่ดี. ฉันขอแนะนำให้ใช้ passport.js มากกว่าทุกครั้ง
UpTheCreek

1
แล้วพาสปอร์ตแทน everyauth ล่ะ?
chovy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.