排队同时NodeJS进程的好方法

时间:2013-08-09 17:14:56

标签: node.js

我正在构建一个简单的应用程序来下载一组XML文件,并使用异步模块(https://npmjs.org/package/node-async)将它们解析到数据库中以进行流控制。总体流程如下:

  1. 从API下载数据集列表(单个请求调用)
  2. 下载每个数据集的元数据以获取指向XML文件的链接(async.each)
  3. 下载每个数据集的XML(async.parallel)
  4. 将每个数据集的XML解析为JSON对象(async.parallel)
  5. 将每个JSON对象保存到数据库(async.each)
  6. 实际上,对于每个数据集,都有一个父进程(2),它包含一系列异步子进程(3,4,5)。我面临的挑战是,因为在特定进程的所有子进程完成之前有很多父进程触发,所以子进程似乎在事件循环中排队,并且所有进程都需要很长时间。特定父进程的子进程,以解决并允许垃圾收集来清理所有内容。结果是,即使程序似乎没有任何内存泄漏,内存使用率仍然太高,最终导致程序崩溃。

    一个有效的解决方案是使一些子进程同步,以便它们可以在事件循环中组合在一起。但是,我还看到了这里讨论的替代解决方案:https://groups.google.com/forum/#!topic/nodejs/Xp4htMTfvYY,它将父进程推送到队列中,并且只允许一次运行某个数字。我的问题是,是否有人知道一个更强大的模块来处理这种类型的排队,或任何其他可行的替代方案来处理这种流量控制。我一直在寻找,但到目前为止还没有运气。

    感谢。

1 个答案:

答案 0 :(得分:1)

我决定发布这个答案:

不要立即启动所有流程。让一个请求的回调启动下一个请求。整体工作仍然是异步的,但每个请求都是串行运行的。然后,您可以将一定数量的连接汇集在一起​​以同时运行,以最大化I / O吞吐量。查看async.eachLimit并用它替换每个async.each示例。

您的async.parallel调用也可能导致问题。