12

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

我注意到存在很多已经这样做但使用 redis 和分叉的库。是否有充分的理由分叉而不是使用集群 API?

编辑,现在我也发现了这个:https ://github.com/xk/node-threads-a-gogo——选项太多了!

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

问题的第二部分:今天最稳定/最常用的nodejs工作队列库是什么?

4

3 回答 3

7

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

于 2013-06-12T15:01:47.693 回答
7

想跟进此事。我的解决方案最终变成了一个你自己的集群实现,其中我的一些集群工作人员是专门的工作人员(即他们只有代码来处理工作)。

我使用日程安排工作。

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

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

于 2014-01-21T16:20:24.307 回答
4

我个人偏爱cluster-master。

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

我喜欢 cluster master 的原因是因为它除了添加用于分叉进程的逻辑之外几乎没有做任何事情,并且让您能够管理正在运行的进程数量,以及一点点日志记录/恢复启动!我发现过于臃肿的流程管理库往往不稳定,有时甚至会减慢速度。

如果满足以下条件,此库将对您有好处:

  • 您的模块很大程度上是异步的
  • 您没有大量不同类型的事件触发
  • 触发的事件有少量工作要做,但是您有很多类似的事件触发(例如 Web 服务器)

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

总而言之,如果您的模块在很大程度上已经是异步的,那么您真正想要的是一个工作池。当您的进程未侦听事件时,最大限度地减少停机时间,并最大限度地增加您可以使用的处理器数量。除非您有一个非常繁忙的同步调用,否则单节点事件循环将难以利用处理器的单个内核。在这种情况下,最好使用 cluster-master。我建议做一些基准测试,看看你的程序在“最坏情况”下可以使用多少单核。假设这是一个核心的 33%。如果你有一台四核机器,然后你告诉集群主机启动 12 个工作人员。

希望这有帮助!

于 2013-06-12T22:02:17.283 回答