nodejs的工作队列?

时间:2013-06-03 19:11:19

标签: node.js message-queue worker

我正在开始使用节点的集群API和mongoose为节点编写工作队列。

我注意到很多lib已经存在,但已经使用redis和forking。是否有充分的理由进行分叉而不是使用集群API?

修改,现在我也发现:https://github.com/xk/node-threads-a-gogo - 选项太多了!

因为我已经使用了mongo,所以我宁愿不添加redis。此外,我的要求非常宽松,我希望持久性,但第一个版本可能没有它。

问题的第二部分: 今天有哪些最稳定/最常用的 nodejs 工作队列库?

3 个答案:

答案 0 :(得分:6)

你试过https://github.com/rvagg/node-worker-farm吗? 它重量很轻,不需要单独的服务器。

答案 1 :(得分:5)

想要跟进此事。我的解决方案最终成为了一个自己的集群impl,我的一些集群工作者是专职的工作人员(即他们只有代码来处理工作)。

我使用agenda进行作业调度。

Cron类型作业由群集主服务器调度。其余的作业在需要时在非工作集群中创建。 (验证电子邮件等)

在此之前我使用kue但放弃它,因为我的应用程序的其余部分使用mongodb而我不喜欢使用redis仅用于作业调度。

答案 2 :(得分:4)

我个人偏爱群集主人。

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

我喜欢群集主服务器的原因是因为它除了添加用于分析流程的逻辑之外几乎没有什么作用,并且使您能够管理正在运行的流程数量,以及一些日志记录/恢复来启动!我发现过于膨胀的流程管理库往往不稳定,有时甚至会减慢速度。

如果以下情况属实,此库将对您有用:

  • 您的模块基本上是异步的
  • 您没有大量不同类型的事件触发
  • 发生的事件需要做很少的工作,但你有很多类似的事件被触发(像Web服务器这样的东西)

以上列表的原因,就是为什么thread-a-gogo可能对你有好处,原因相反。如果你的代码中有一些点,那么你的事件循环中有很多工作要做,像thread-a-gogo那样专门为这项工作启动一个“线程”是很棒的,因为你没有确定提前产生了多少工人,而是催生他们在需要时做工作。注意:如果它们有很多可能会产生,这也可能会很糟糕,如果你开始启动过多的进程实际上可能会陷入困境,但我离题了。

总而言之,如果您的模块已经基本上是异步的,那么您真正想要的是工作池。最小化进程未侦听事件时的停机时间,并最大化可以使用的处理器数量。除非您有一个非常繁忙的同步调用,否则单个节点事件循环将利用甚至处理器的单个核心来解决问题。在这种情况下,你最好使用cluster-master。我建议做一些基准测试,看看你的程序在“最坏情况”下可以使用多少单核。让我们说这是一个核心的33%。如果您有四核机器,那么您可以告诉集群主机为您启动12名工作人员。

希望这有帮助!