优化Node.js入站/出站连接

我有关于node.js入站/出站连接的问题。 让我们考虑一下我的情况或者我想达到的目的:

我有例如每秒X入站http请求。 对于每个请求,我创build出站https请求给一些第三方(他们回应我平均300毫秒)。 当我收到这个第三方的回复时,我认为这个请求会被处理。 让我们想象第三方有很多很多的服务器,可以并行pipe理请求。 对于每个请求我有几个mongoDB查询(这是快速)。 我使用快速框架。

在我的笔记本电脑(4核心和4 GB的RAM与Windows和很多其他程序可能会损害性能可能会损坏)我能够得到每秒150个请求,但只有40个被处理。

我不知道:这实际上是现实吗?理论上我不能在这个世界上有更多或者某个地方能够获得一些解决scheme/技巧来改善我的performance吗?

感谢您的任何build议。

通过节点,你可以为这种场景做一个非常简单的优化,那就是创build一个工作池。 由于v8引擎的工作方式以及节点如何使用事件循环等,单个节点进程实际上只能使用处理器核心的50%左右。 假设一个相对标准的事件循环(不是大量的同步工作),你的描述对文件服务器来说是很典型的(大量的I / O但是处理器很less的操作),你可以通过启动来获得显着的性能提升许多节点工人。 这可以最大限度地减less某个节点进程不监听事件的时间,并最大限度地提高CPU的工作量。 这当然不会加速单个交易,但是它将允许build立单个的硬件来最大化一次可以提供服务的交易量。

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

集群pipe理员是pipe理员工的一个便利工具,保持创build员工池的过程稳定而简单,我相信可以使用NPM进行安装。

编辑:

什么可以运行asynchronous,什么可以运行同步并不总是很容易告诉。 有些事情要注意的一些经验法则:

  • 节点/库名称中的同步调用…

  • function很大,对其他function的调用很less。

  • 繁忙的循环

一些替代品:

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

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库。 除非你有机会查看代码,或者对图书馆有正面的评论,否则假设你所做的任何图书馆调查都会变得更糟,并且调查是否是问题的根源。