扩展节点.js

Scaling Node.js

提问人:nornagon 提问时间:1/17/2011 最后编辑:Peter Mortensennornagon 更新时间:3/8/2018 访问量:28568

问:

我对大规模服务器端开发相当陌生。我想使用 Node.js 编写服务器,但在我继续前进之前,我想知道将节点扩展到每秒 20 个查询的一般原则是什么。

我正在编写的服务将主要是一个数据库的接口,以及输入数据的身份验证和验证。

节点.js 可伸缩性

评论

0赞 Thilo 1/17/2011
“扩展节点”是什么意思?启动多个节点进程?
3赞 slebetman 1/17/2011
每秒 20 个查询是相当低的。Node.js 应该能够同时处理数千个连接。只是不要做繁重的循环处理,因为它会阻塞整个解释器。相比之下,您的用例应该相当轻量级。在 Node 中,数据库连接会自动生成到线程,并在 javascript 级别异步处理。

答:

150赞 Alfred 1/17/2011 #1

负载均衡

最有可能的是,对于最简单的网站,您根本不需要任何缩放。只需一个盒子就可以满足您的需求。在那之后,你应该像你提到的那样进行负载平衡,这对每个架构来说几乎都是相同的(就像你说你可以先启动多个节点进程一样。但是当你变得非常大时,你需要更多的盒子)。

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;
    }
  }
}

雷迪斯

每秒 20 个查询

节点.js没有汗水。您应该使用 redis 作为您的数据存储,因为它非常快速:)。当您使用 node 时,甚至还有一个 c 库node_redis

npm install hiredis redis

Hiredis 为您提供了出色的性能,因为它可以在节点内编译为 C 代码。以下是 redis 与 hiredis 一起使用时的一些基准测试。

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 就不算什么:)。

认证


更新:


我说了很多,但为了上帝的爱,请不要试图实现你自己的身份验证系统。它可能会不安全(很多地方可能会出错),需要做很多工作。对于身份验证,您应该使用出色的 connect-auth 库使用 facebook-connect、twitter 单点登录等。然后你是安全的,因为他们有专家在那里测试登录系统是否有漏洞,而且也不通过纯文本传输密码,但感谢上帝使用https。我还为想要使用facebook-connect的用户回答了一个主题。

输入数据的验证

要验证输入,您可以使用 node-validator

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

//Validate
check('[email protected]').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赞 Alfred 1/17/2011
@nornagon欢迎:)。特别记住不要编写自己的登录系统;)。此外,Jeff Atwood(Stackoverflow 作者)强烈建议不要这样做!=> blog.stackoverflow.com/2010/04/openid-one-year-later
10赞 Shripad Krishna 1/17/2011
您可以使用 HAProxy 对 WebSocket 进行负载均衡,因为 nginx 无法正常工作:)前提是您正在开发需要您在某处使用 WebSockets 的应用程序!只是对@alfred已经很棒的答案的补充。
5赞 Shripad Krishna 1/20/2011
一个 HAProxy 设置示例,以防您使用 websockets: stackoverflow.com/questions/4360221/...
9赞 UpTheCreek 9/12/2012
好答案。不过,我强烈建议使用护照.js而不是每个身份验证。
1赞 chovy 1/3/2014
Passport 而不是 Everyauth 呢?