NodeJS是否适合网站 - (即端口阻塞)?

时间:2017-03-23 08:45:43

标签: node.js

我已经度过了许多痛苦的月份,现在我已经准备好让它进入“什么是网站节点js-is-a-great-lie-!!!”这个网站。

所有NodeJS教程都讨论了如何创建网站。完成后,它可以工作。但对于一个人一次。发送到端口的所有请求都将被先到先得的情况阻止。为什么?因为发送到nodejs服务器的大多数请求必须被解析,数据库请求的数据,计算和解析的数据,响应准备并发送回ajax调用。 (这只是一个简单的网站示例)。

同样适用于身份验证 - 发出请求,解析数据,进行身份验证,创建会话并将其发送回请求者。

无论你如何涂糖 - 所有要求都是这样做的。是的,您可以使用异步功能,这将缩短在某些部分上花费的时间,是的,您可以尝试承诺,是的,您可以使用群集,是的,您可以使用分叉/产生等等...结果始终是相同的:端口被阻止。

我尝试使用引用进行响应,以便我们可以使用套接字将数据传回并将其与引用相匹配 - 这也阻止了它。

问题的关键在于:当你寻求帮助时,每个人都想要所有类型的代码示例,但绝不会去帮助实际有效的答案。整个世界!!!!!这让我得出了nodeJS不适合网站的答案。

我阅读了很多有关此问题的请求,所有这些请求都得到满足:“你必须正确编码”..!真?是不是没有NodeJS技术娴熟,经验丰富的人可以在这个问题上给出答案???? !!!!!

大多数NodeJS编码器都来自PHP方面 - 所有使用PHP的网站都不必为了显示网页而使用任何解决方法,并且它永远不会同时阻止2个人。感谢网络服务器。

那么为什么NodeJS社区不能在这个问题上找到某种方式而不是:“代码小心”??? !!!

他们想要的例子 - 每个例子都满足:“好吧,这是一个阻止代码,做另一种方式”,或“仔细编码”!来一个人!!!

考虑以下场景:一个用户,一个页面,包含4个记录列表。从理论上讲,所有列表都应该独立填写记录。由于数据的请求,准备和响应方式正在发生什么,现实中的每个列表都在等待下一个完成。仅在一个会议上就是这样。

2个人,同时2个课程怎么样?

所以我的问题是:NodeJS适用于网站,如果是,任何人都可以用短代码显示和证明这一点吗?如果您无法证明,那么答案是:“NodeJS不适合网站!”

以下是基于最简单教程的示例,它仍在阻止:

var express = require('express'),
    fs      = require("fs");

var app = express();
app.get('/heavyload', function (req, res) {
    var file    = '/media/sudoworx/www/sudo-sails/test.zip';

    res.send('Heavy Load');
    res.end();

    fs.readFile(file, 'utf8', function (err,fileContent) {

    });

});


app.get('/lightload', function (req, res) {
    var file    = '/media/sudoworx/www/sudo-sails/test.zip';
    res.send('Light Load');
    res.end();
});

app.listen(1337, function () {
    console.log('Listening!')
});

现在,如果你去“/ heavyload”它会立即响应,因为这是发送到浏览器的第一件事,然后nodejs继续读取一个繁重的文件(一个大文件)。如果您现在同时转到第二个调用“/ lightload”,您将看到它正在等待加载文件,以便在继续浏览器输出之前从第一个调用完成。这是一个最简单的例子,说明nodejs如何在处理php和类似脚本语言中的简单方法时失败。

如前所述,我在nodejs程序员的职业生涯中尝试了多达20种不同的方法。我非常喜欢nodejs,但是我无法克服这个障碍......这不是一个抱怨 - 这是一个求助的呼吁,因为我在我的终点路上有nodejs,我不知道该怎么办。

我非常感谢你。

2 个答案:

答案 0 :(得分:0)

  

是适合网站的NodeJS

肯定是的。

  

任何人都可以通过短代码展示和证明这一点

没有

  

所有使用PHP的网站都不必使用任何解决方法   为了显示一个网页,它永远不会阻止2人   同一时间。

Node.js也不需要任何解决方法,它只是无阻塞地工作。

要更广泛地回答您的问题/投诉:

单个node.js计算机可以轻松地充当网站的网络服务器并处理多个会话(实际上数百万),而无需任何解决方法。

如果您来自PHP网络服务器,可能不是尝试将现有代码迁移到新的Node网站,而是首先使用在线简单进行游戏Node.js + express的网站示例,如果效果很好,您可以开始添加需要长时间运行的流程的代码,例如从DB读取或读取/写入文件并验证访问者是否被阻止(他们不应该阻止)。

请参阅this tutorial了解如何开始使用。

更新示例代码

要修复提供的示例代码,您应该将fs.readFile电话转换为fs.createReadStream。对于大型文件,readFile不太值得推荐,我认为readFile字面上没有阻止任何内容,但是需要分配和移动大量字节可能会阻塞服务器,createReadStream使用块来代替这在CPU和RAM上要容易得多:

    rstream = fs.createReadStream(file);
    var length = 0;
    rstream.on('data', function (chunk) {
        length += chunk.length;
        // Do something with the chunk
    });
    rstream.on('end', function () {  // done
        console.log('file read! length = ' + length);
    });

将代码切换为createReadStream后,我可以在约3毫秒的时间内继续拨打heavyload / lightload

我应该写的更好的答案

Node.js是一个单一流程架构,但它具有多进程功能,使用cluster模块,它允许您编写主/代码代码,在多个进程上分配多个工作负载

您还可以使用pm2为您执行群集,它有一个内置的负载均衡器可以分配到工作,还可以在不停机的情况下进行扩展/缩小,请参阅this

在您的情况下,当一个进程正在读/写一个大文件时,其他进程可以接受传入的请求并处理它们。

答案 1 :(得分:0)

所以这就是我发现的。我将用一个阻塞代码的例子来回答它:

for (var k = 0; k < 15000; k++){
    console.log('Something Output');
}
res.status(200).json({test:'Heavy Load'});

这会阻塞,因为它必须长时间执行for循环,然后在完成后它将发送输出。

现在,如果您执行相同的代码,则不会阻止:

function doStuff(){
    for (var k = 0; k < 15000; k++){
        console.log('Something Output');
    }   
}
doStuff();

res.status(200).json({test:'Heavy Load'});

为什么呢?因为函数是异步运行的......!那么我如何将结果响应发送给请求客户端?目前我这样做:

  1. 运行doStuff功能
  2. 发送一个唯一的呼叫参考,然后由客户端的ajax呼叫接收。
  3. 将客户端的回调函数放入等待对象。
  4. 听插座
  5. 当doStuff函数完成时,它应该发出一个套接字消息,其中包含结果响应和唯一引用
  6. 当客户端的套接字获得带有唯一引用和结果响应的消息时,它将与等待的回调函数匹配并运行它。
  7. 完成!一点解决方法(如前所述),但它正在工作!它确实需要一个socket来监听。这就是我对NodeJS中这种端口阻塞情况的解决方案。

    还有其他方法吗?我希望有人用另一种方式回答,因为我仍然觉得这是一些解决方法。 EISH! ;)