微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Node.js异步并行 – 后果是什么?

代码,
async.series(tasks,function (err) {
    return callback ({message: 'tasks execution error',error: err});
});

其中,tasks是函数数组,每个函数都执行HTTP请求(使用请求模块)并调用MongoDB API来存储数据(到MongoHQ实例).

使用我当前的输入(〜200个要执行的任务),它需要

[normal mode] collection cycle: 1356.843 sec. (22.61405 mins.)

但只是尝试从系列变为平行,它给予了巨大的好处.几乎相同数量的任务在~30秒内运行,而不是〜23分钟.

但是,知道什么都不是免费的,我试图了解这种变化的后果是什么?我可以说开放套接字的数量会更高,内存消耗更多,对数据库服务器的影响更大吗?

我运行代码的机器只有1GB的内存Ubuntu,所以我应用程序挂起一次,是否可能是由于资源不足造成的?

解决方法

你的直觉是正确的,并行性不是免费的,但你当然可以为此付出代价.

使用负载测试模块(或模块集合)(如nodeload),您可以量化此并行操作如何影响服务器以确定它是否可接受.

如果需要,Async.parallelLimit可以是限制服务器负载的好方法,但首先发现是否需要限制是很重要的.显式测试是发现系统限制的最佳方式(eachLimit具有不同的签名,但也可以使用).

除此之外,使用async.parallel的常见缺陷包括想要比函数提供的更复杂的控制流(从您的描述看起来似乎不适用)并且天真地使用并行太大的集合(例如,可能会导致您如果要编写许多文件,请进入系统的文件描述符限制).在1GB RAM上进行~200请求和保存操作时,我认为只要你没有在事件处理程序中进行太多按摩,你就会没事,但如果你遇到服务器挂起,parallelLimit可能是一个很好的出路.

同样,测试是解决这些问题的最佳方式.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐