2

我对 node.js 入站/出站连接有疑问。让我们考虑一下我的情况或我想要实现的目标:

例如,我每秒有 X 个入站 http 请求。对于每个请求,我都会向某个第三方创建出站 https 请求(他们平均在 300 毫秒内回复我)。当我收到该第三方的回复时,我认为该请求已得到处理。让我们想象一下第三方有很多很多的服务器,并且可以并行管理请求。对于每个请求,我都有很少的 mongoDB 查询(速度很快)。我使用快递框架。

在我的笔记本电脑(4 核和 4 GB RAM,Windows 和许多其他可能会损害性能的程序)中,我每秒能够获得 150 个请求,但只处理了 40 个。

我不知道的是:这实际上是现实吗?理论上我无法实现更多或在这个宇宙的某个地方有一些解决方案/技巧可以提高我的表现?

感谢您的任何建议。

4

1 回答 1

2

对于节点,您可以针对这种类型的场景进行非常简单的优化,那就是创建一个工作池。由于 v8 引擎的工作方式,以及节点如何使用事件循环等……单个节点进程实际上只能希望使用处理器内核的 50% 左右。假设一个相对标准的事件循环(不是大量的同步工作要做),您的描述似乎是典型的文件服务器(大量 I/O,但很少有处理器繁重的操作),您可以通过启动获得显着的性能提升许多节点工作者。这可以最大限度地减少您的一个节点进程未侦听事件的时间,并最大限度地提高 CPU 的工作量。这当然不会加速单个交易,

https://github.com/isaacs/cluster-master

Cluster-master 是一个方便的工具,用于管理工作人员,并保持创建工作人员池的过程稳定和简单,我相信可以与 NPM 一起安装。

编辑:

什么可以运行异步,什么必须运行同步并不总是很容易分辨。需要注意的一些经验法则:

  • 名称中带有同步的节点/库调用...

  • 大型函数,很少调用其他函数。

  • 忙 while 循环

一些替代方案:

如果您有一个无法避免的繁忙 while 循环。你可以做一些很酷的逻辑,至少让你的事件循环时间抓住新的事件。这可能不是很有效的代码(不是在带有节点的 pc 上),但它应该演示这个概念:

var someInt;
function callBack() {
    doWorkWith(someInt);
    someInt++;
    if(someInt < someMaximum) event.trigger(whileLoop);//The entire event loop will be able to run before we get to the next iteration of callback because we're using events!
}

event.register(whileLoop, callBack);

我不记得在节点中注册事件的代码,但是当你需要 while 循环时,这个逻辑很有用,因为它允许你的整个事件循环在每次迭代时运行,其中:

while(someInt++ < someMax) {
    doWorkWith(someInt);
}

当 while 循环运行时,不会让任何其他事件被拾取。

需要注意的另一件事是库程序员的不良做法,尤其是 I/O 库。除非您有机会查看代码,或者对某个库有非常积极的评价,否则请假设您所做的任何库调用都更糟,并调查它们是否是问题的根源。

于 2013-06-13T13:42:12.153 回答