缩放Node.js

nor*_*gon 86 scalability node.js

我是大规模服务器端开发的新手.我想使用Node.js编写一个服务器,但在我开始之前,我想知道将节点扩展到每秒20个查询的一般原则是什么.

我正在编写的服务主要是数据库的接口,以及输入数据的认证和验证.

Alf*_*red 148

负载均衡

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

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Redis的

每秒20个查询

node.js没有汗水.你应该使用redis作为你的数据存储区,因为它很疯狂:).使用node_redis时,甚至有节点的ac库.

npm install hiredis redis
Run Code Online (Sandbox Code Playgroud)

Hiredis是为您提供kickass性能的原因,因为它编译为节点内的C代码.以下是与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
Run Code Online (Sandbox Code Playgroud)

当你看那些数字然后20/s是没有 :).

认证


更新:


我告诉了很多,但为了上帝的爱,请不要尝试实现自己的身份验证系统.这可能是不安全的(很多都可能出错),很多工作.对于身份验证,您应该使用优秀的connect-auth库使用facebook-connect,twitter单点登录等.然后你被保险,因为他们有专家在那里测试登录系统的漏洞,也不通过纯文本传输密码,但感谢上帝使用https.我也为想要使用facebook-connect的用户回答了一个主题.

验证输入数据

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

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>'
Run Code Online (Sandbox Code Playgroud)

还有这个表单库来帮助您创建表单.

  • 您可以使用HAProxy进行负载平衡WebSockets,因为nginx将无法正常运行:)如果您正在开发需要在某处使用WebSockets的应用程序,则可以使用此方法!只是@ alfred已经很棒的答案的补充. (10认同)
  • 好答案.我强烈推荐passport.js over everyuth. (9认同)
  • 一个示例HAProxy设置,以防您使用websockets:http://stackoverflow.com/questions/4360221/haproxy-websocket-disconnection/4737648#4737648 (5认同)