我正在开始使用节点的集群 API 和猫鼬为节点编写工作队列。
我注意到存在很多已经这样做但使用 redis 和分叉的库。是否有充分的理由分叉而不是使用集群 API?
编辑,现在我也发现了这个:https ://github.com/xk/node-threads-a-gogo——选项太多了!
我宁愿不添加 redis,因为我已经在使用 mongo。此外,我的要求非常宽松,我想要持久性,但对于第一个版本可以没有它。
问题的第二部分:今天最稳定/最常用的nodejs工作队列库是什么?
我正在开始使用节点的集群 API 和猫鼬为节点编写工作队列。
我注意到存在很多已经这样做但使用 redis 和分叉的库。是否有充分的理由分叉而不是使用集群 API?
编辑,现在我也发现了这个:https ://github.com/xk/node-threads-a-gogo——选项太多了!
我宁愿不添加 redis,因为我已经在使用 mongo。此外,我的要求非常宽松,我想要持久性,但对于第一个版本可以没有它。
问题的第二部分:今天最稳定/最常用的nodejs工作队列库是什么?
你试过https://github.com/rvagg/node-worker-farm吗?它重量很轻,不需要单独的服务器。
我个人偏爱cluster-master。
https://github.com/isaacs/cluster-master
我喜欢 cluster master 的原因是因为它除了添加用于分叉进程的逻辑之外几乎没有做任何事情,并且让您能够管理正在运行的进程数量,以及一点点日志记录/恢复启动!我发现过于臃肿的流程管理库往往不稳定,有时甚至会减慢速度。
如果满足以下条件,此库将对您有好处:
上面列出的原因是threads-a-gogo可能对你有好处的原因,相反的原因。如果你的代码中有一些地方,在你的事件循环中有很多工作要做,那么像threads-a-gogo这样专门为这项工作启动一个“线程”的东西很棒,因为你没有确定提前生成多少工人,而是在需要时让他们工作。注意:如果有可能生成很多进程,这也可能很糟糕,如果你开始启动太多进程,事情实际上可能会陷入困境,但我离题了。
总而言之,如果您的模块在很大程度上已经是异步的,那么您真正想要的是一个工作池。当您的进程未侦听事件时,最大限度地减少停机时间,并最大限度地增加您可以使用的处理器数量。除非您有一个非常繁忙的同步调用,否则单节点事件循环将难以利用处理器的单个内核。在这种情况下,最好使用 cluster-master。我建议做一些基准测试,看看你的程序在“最坏情况”下可以使用多少单核。假设这是一个核心的 33%。如果你有一台四核机器,然后你告诉集群主机启动 12 个工作人员。
希望这有帮助!