扩展Node.js


86

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

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


“扩展节点”是什么意思?启动多个节点进程?
Thilo

3
每秒20个查询是相当低的。Node.js应该能够处理数千个同时连接。只是不要执行重循环处理,因为它会阻塞整个解释器。相比之下,您的用例应该轻巧。在Node中,数据库连接会自动生成为线程,并在javascript级别进行异步处理。
slebetman 2011年

Answers:


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

雷迪斯

每秒20个查询

node.js不费吹灰之力。您应该使用redis作为您的数据存储,因为它非常快:)。当您使用node_redis时,甚至为节点提供一个ac库。

npm install hiredis redis

Hiredis之所以能够为您带来无与伦比的性能,是因为它可以编译为节点内部的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

当您查看这些数字时,则没有显示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>'

还有一个此表单库可帮助您创建表单。


1
@nornagon不客气:)。特别要记住不要编写自己的登录系统;)。Jeff Atwood(Stackoverflow作者)也强烈建议不要这样做!=> blog.stackoverflow.com/2010/04/openid-one-year-later
Alfred

10
您可以使用HAProxy来对WebSocket进行负载平衡,因为nginx无法正常工作:)前提是您正在开发需要在某个地方使用WebSocket的应用程序!只是@alfred已经非常棒的答案的补充。
Shripad Krishna 2011年

5
:一个例子HAProxy的设置,如果你使用WebSockets stackoverflow.com/questions/4360221/...
Shripad克里希纳

9
好答案。不过,我还是强烈建议不要使用Everyauth的passport.js。
UpTheCreek 2012年

1
护照而不是Everyauth呢?
chovy 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.