Node.js能否在Web用例之外经受高速和高并发?

时间:2018-04-19 16:04:05

标签: node.js performance events

我一直致力于一个项目,由于图书馆的支持,我只能在Node和Python之间做出选择,因为Node支持更好,我也不特别关心语言(或他们各自的衍生物),我为我的项目选择了Node.js.

我认为这会很好地摆脱。这个组件是一个资源监视器,有效地组织起来像Erlang或Scala的actor系统:有一个独立的"滴答作响的"每个资源的状态机,用于检查状态,发出I / O请求,对传入的数据流进行排序和处理,以及更改状态。

因此,它是一个高度并发的系统,主要受I / O限制,但也有一大堆CPU耗费的工作。

我意识到这里不允许发表意见,但互联网上几乎没有任何规则允许我向同行提出这种专业意见,我觉得这很疯狂。所以无论如何我都会尝试。

我的问题是:Node.js能否胜任这项任务?我知道它的单线程有一个运行show的事件循环。它是否足够聪明以避免资源匮乏或该模型的其他陷阱?我是否应该期望这个东西可以处理大量的并发监视器,或者我是否应该对这个东西进行横向扩展?

我的想法是我可以将大量的逻辑输出并转移到Go程序中,该程序负责合理的负载平衡并且还减轻了Node事件循环的一些压力,但我试图尝试了解将会落在路线图中的哪个位置。

TIA,您可以根据规则获得任何灵活性。我认为我们作为一个社区有一些来自Web2.0垃圾邮件日的PTSD,我们需要回到世界上的一些观点:)

1 个答案:

答案 0 :(得分:0)

node.js几乎可以适应任何事情,尤其适用于繁重的I / O相关工作。如果你有一些繁重的CPU计算,那么你会希望获得更多的CPU参与工作。有很多方法可以做到这一点,所有这些方法都相当简单。

例如,您可以使用内置群集模块在一台服务器上执行纯粹群集,这样可以利用该服务器上的所有CPU。所需的唯一真正的设计变更是,您希望在服务器进程之间共享的任何数据必须位于其自己的进程中(例如redis或其他一些数据库),以便所有集群进程都可以访问该数据。在某些情况下,使用" sticky"可能更有效或更高效。每次返回集群中同一服务器的客户端(完全取决于您正在做的事情)。

或者,在某些情况下,它可以更好地创建CPU密集型工作的工作队列,并具有一系列专门的工作进程来执行CPU处理,使主进程可以自由响应请求并执行I / O工作非常有效率。

在其他一些情况下,您甚至可以同时执行这两种操作(拥有专门子进程的工作队列并使用群集)。

  

我的问题是:Node.js能否胜任这项任务?

是的,如果你设计得恰当的话。最终,您必须实施,测试,测量和进行设计更改,以适应您的学习。

  

我知道它的单线程有一个运行show的事件循环。它是否足够聪明以避免资源匮乏或该模型的其他陷阱?

我不确定你的意思是什么,资源饥饿"。事件循环模型非常有效且非常有效,代码可以完成一些工作,然后是一些I / O,然后是一些工作,然后是一些I / O,然后返回结果,只要"一些工作"没有太多的CPU。 node.js服务器可以使用此模型非常有效地处理大量同时请求(比线程模型更有效)。如果你确实有较重的CPU工作,那么为了达到更高的规模,你需要涉及更多的CPU,如上所述。

  

我是否应该期望这个东西可以处理大量的并发监视器,或者我是否需要对这个东西进行横向扩展?

正如我已经说过的,如果你有CPU密集型工作,你至少需要涉及服务器上的所有CPU(就像你需要对任何编程环境一样)。根据您所讨论的计算量,您可能还需要水平扩展服务器。您需要先构建一个非水平扩展的实现,然后进行一些扩展测试,以确定是否需要进一步扩展。与任何服务器端环境中的任何服务器端问题一样,您无法完全预测瓶颈所在的位置。当你知道你的大规模拍摄时,最好的方法是设计一些能够通过进一步开发进行横向缩放的东西,但是实现你的第一台服务器并测试你的瓶颈所在,修复那些瓶颈,迭代等等。设计和实施远远超过任何现实世界的测试也是一个错误,因为您可能正在处理错误的问题。在您测试实际代码之前,这些内容并不容易预测。