根据这个答案:
您应该在一个盒子上运行多个节点服务器,每个核心1个并在它们之间拆分请求流量.这提供了出色的CPU亲和力,并且可以随着核心数量几乎线性地扩展吞吐量.
知道了,所以让我们说我们的盒子有2个核心以简化.
我需要一个完整的示例,Hello World使用NGINX在两台节点服务器之间进行负载平衡.
这应包括任何NGINX配置.
让我们看一下简单的代码片段:
var express = require('express');
var app = express();
var counter = 0;
app.get('/', function (req, res) {
// LOCK
counter++;
// UNLOCK
res.send('hello world')
})
Run Code Online (Sandbox Code Playgroud)
假设这app.get(...)被调用了很多次,并且您可以理解,我不希望该行counter++由两个不同的线程同时执行。
因此,我想锁定此行,以便只有一个线程可以访问此行。我的问题是如何在node.js中做到这一点?
我知道有一个锁包:https://www.npmjs.com/package/locks,但是我想知道是否有没有外部库的“ 本机 ”方式。
我使用以下代码来利用群集npm为我的节点应用程序.
form = require("connect-form");
express = require("express");
app = express.createServer(form({ keepExtensions: true }));
cluster = require("cluster");
// App configuration
// ....
// Run on cluster
cluster( app )
.use(cluster.logger('logs'))
.use(cluster.stats())
.use(cluster.pidfiles('pids'))
.use(cluster.cli())
.listen(port);
Run Code Online (Sandbox Code Playgroud)
这在节点0.4.4上工作正常,但我最终在节点0.6.5上出现以下错误
luc @ localhost:〜/ server $ node app.js
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: Property 'cluster' of object #<Object> is not a function
at Object.<anonymous> (/home/luc/server/app.js:15:1)
at Module._compile (module.js:432:26)
at Object..js (module.js:450:10)
at Module.load (module.js:351:31)
at Function._load (module.js:310:12)
at …Run Code Online (Sandbox Code Playgroud) 我阅读了大量文章和stackoverflow问题,也看到了很多关于线程池的信息,但没有人谈论物理CPU内核使用情况。我相信这个问题没有重复。
鉴于我有一台四核计算机和大小为 4 的 libuv 线程池,Node.js 在处理大量 i/o 请求(可能超过数千个)时是否会利用所有这 4 个内核?
我也很好奇哪个i/o 请求使用thread pool。没有人给出清晰完整的请求清单。我知道 Node.js 事件循环是单线程的,但使用线程池来处理 I/O,例如访问磁盘和数据库。