Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs不应该做什么?_Node.js_Nginx - Fatal编程技术网

Node.js nodejs不应该做什么?

Node.js nodejs不应该做什么?,node.js,nginx,Node.js,Nginx,我现在已经进行了几周的节点深度潜水。我从Anthony关于udemy的优秀课程中学到了很多,目前我正在阅读一本书《nodejs the right way》。我还阅读了很多文章,这些文章提出了一些关于使用节点和耦合其他技术的真实世界场景的非常好的观点 然而,这似乎被认为是一条规律,即不使用节点作为单线程体系结构来执行计算繁重的任务。我了解了事件循环和异步回调等概念。事实上,如果我理解正确,节点的强度源于大量并发IO连接。不管我在哪里阅读,源代码都警告不要挂断执行任务的线程。我似乎找不到任何经验法

我现在已经进行了几周的节点深度潜水。我从Anthony关于udemy的优秀课程中学到了很多,目前我正在阅读一本书《nodejs the right way》。我还阅读了很多文章,这些文章提出了一些关于使用节点和耦合其他技术的真实世界场景的非常好的观点

然而,这似乎被认为是一条规律,即不使用节点作为单线程体系结构来执行计算繁重的任务。我了解了事件循环和异步回调等概念。事实上,如果我理解正确,节点的强度源于大量并发IO连接。不管我在哪里阅读,源代码都警告不要挂断执行任务的线程。我似乎找不到任何经验法则来避免在进程中使用节点。我见过一个解决方案,它说node应该将计算量大的任务传递给RabbitMQ这样的消息服务,专用的应用程序服务器可以通过该服务(有什么建议可以与node进行此任务的配对吗?我读了一些关于N层体系结构的文章)。我之所以如此困惑,是因为我看到节点被用来读取和写入文件,以突出流的使用,但在我看来,获取/读取/写入文件是一项昂贵的任务(我感觉错了)

Tl;Dr节点应该将哪些类型的任务传递给工作主机服务器?我可以阅读哪些详细解释范例的材料


编辑:我的不理解似乎源于不知道在一个明显的同步IO请求之外,什么会首先停止一个线程。因此,如果我理解正确,读写数据就是IO,在IO中,改变所述数据或进行数学计算在计算上是昂贵的(当然,在不同的水平上取决于任务)。谢谢你的回答

如果您使用node.js作为服务器,那么运行长时间运行的同步计算任务会占用一个线程,并且在计算期间,您的服务器不会响应其他请求。对于服务器来说,这通常是一个糟糕的情况

因此,node.js服务器设计的一般设计原则如下:

  • 仅使用异步I/O函数。例如,使用
    fs.readFile()
    ,而不是
    fs.readyFileSync()

  • 如果有计算密集型操作,则将其移动到子进程。如果您做了很多这样的操作,那么就有几个子进程可以处理这些长时间运行的操作。这将使主线程保持空闲状态,以便它能够响应I/O请求

  • 如果希望提高服务器的总体可伸缩性和响应能力,可以使用每个CPU的服务器进程实现集群。这并不能真正替代上面的#2,但也可以提高可伸缩性和响应能力

  • 我之所以如此困惑是因为我看到节点被用于 读取和写入文件以突出流的使用,但在我的 获取/读取/写入文件是一项昂贵的任务(我觉得 错误的)

    如果您使用异步版本的I/O函数,那么从磁盘读/写不会阻塞主JS线程,因为它们提供了一个异步接口,并且主线程可以在系统从磁盘获取数据时执行其他操作

    节点应该传递给work horse服务器什么类型的任务

    这在一定程度上取决于您试图支持的服务器负载、您要求它做什么以及您对响应延迟的容忍度。目标负载越高,就越需要将计算密集型任务从主JS线程转移到其他进程中。在中等数量的长时间运行的事务和适度的服务器负载下,您可能仅仅能够使用集群来实现您的可伸缩性和响应性目标,但是在事务长度或您试图支持的负载的某个阈值下,您必须从主JS线程中获得计算密集型的内容

    然而,这似乎被认为是一条规律,即不使用节点作为单线程体系结构来执行计算繁重的任务

    我要改写这句话:

    不要执行计算繁重的任务,除非您需要使用Node

    有时候,你需要处理一堆数据。有时,在过程中做这件事比传递它更快或更好

    一个实际例子: 我有一个Node.js服务器,它从一堆服务器读取原始日志数据。没有标准的日志记录实用程序可以使用,因为我有一些正在进行的自定义处理,以及用于获取日志数据的自定义身份验证方案。整个过程就是HTTP请求,然后解析和重新写入数据

    可以想象,这需要大量的CPU。但事情是这样的。。。CPU浪费了吗?如果我用另一种语言写的话,我能用JS做什么更快的事情吗?通常情况下,CPU因某种真正的原因而忙碌,而切换到更本机的设备的好处可能微乎其微。然后,你必须考虑到交换的开销

    请记住,使用Node.js,您可以编译本机扩展,因此,在一个完善的框架中,您可以做到两全其美

    对我来说,人与人之间的取舍起了作用。我是一个比任何本机运行的Node.js开发人员都高效得多的开发人员。即使我的Node.js应用程序被证明比本机应用程序慢5倍(我认为这是极端情况),我也可以多买5台服务器来运行,成本比我开发和维护本机解决方案要低得多

    使用你需要的东西。如果需要在Node.js中消耗大量CPU,请确保尽可能高效地使用。如果您发现可以用本机代码优化某些东西,请考虑将扩展扩展到MUMU。