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

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

推荐答案

负载平衡

对于最简单的网站,你可能根本不需要任何zoom .只要一个盒子就可以把你盖住.之后,你应该像你提到的那样进行负载平衡,这对于每种架构几乎都是一样的(就像你说的,你可以先启动多个 node 进程.但是当你变得非常大时,你需要更多的盒子).

Nginx load balancing example:

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时,甚至还有一个用于node的c库.

npm install hiredis redis

Hiredis能给你带来惊人的性能,因为它在 node 内部编译成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是NOTHING:).

认证


Update:

  • 一百

  • 一百


我说了很多,但看在god 的份上,请不要try 实现自己的身份验证系统.这可能是不安全的(很多事情可能会出错),很多工作.对于身份验证,您应该使用facebook connect、twitter单点登录等,使用卓越connect-auth库.然后你就安全了,因为他们有专家测试登录系统是否有漏洞,而且他们也不会通过纯文本传输密码,但感谢god 使用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>'

还有这个forms库可以帮助你创建表单.

Node.js相关问答推荐

在我的Next.js应用程序中没有正确设置Process.env.NODE_ENV

如何使用MongoDB在Node.js 中向数组中添加项?

JEST模拟由http服务器控制器导入的ES模块

关于Node.js中的AES加密库的问题

一个函数中的两个依赖的NodeJS数据库操作.如果第二个失败了怎么办?

ForbidenError:使用Express.js的CSRF令牌无效

使用 axios 和 Cheerio (Node js) 抓取 google 搜索

发布请求不使用 Nodejs 更新 MongoDB 中的标头信息

等待不在 Express.js 中处理 res.app.render

处理 UTC 日期和future

使用mongoose 创建新文档并仅取回选定的字段

用户通过 oauth2 twitter 授权或通过Passport discord后如何重定向到 React/Vue 路由?

使用中的端口代码:'EADDRINUSE',即使在 kill 命令之后

如何在 Nest.js 中使用查询参数?

Node.js 变量声明和范围

使用 MongoDB 更新嵌套数组

PhoneGap/Cordova Android 开发

如何从 findOneAndUpdate 方法中获取更新的文档?

我应该如何在 webpack 中使用时刻时区?

NodeJS:如何调试检测到 EventEmitter 内存泄漏.添加了 11 个侦听器