最新版本号[免费下载]

NodeJS与多核HTTP服务器

作者:本站编辑 发布时间:2015-11-24 来源:本站原创 点击数:

简单地说,NodeJS是一个使用了Google高性能V8引擎 的服务器端JavaScript实现。它提供了一个(几乎)完全非阻塞I/O栈,与JavaScript提供的闭包和匿名函数相结合,使之成为编写高吞吐量网络服务程序的优秀平台。在我们内部,雅虎邮件队正调研能否使用NodeJS开发一些我们即将推出的新服务。我们认为分享我们的劳动成果是一件十分有意义的事情。

目录

  • 在多处理器系统上使用NodeJS的情况

  • 充分利用多处理器的优势

    • 使用软件负载均衡

    • 使用操作系统内核做负载均衡

    • 使用NodeJS转发请求

  • 结论

在多处理器系统上使用NodeJS的情况

NodeJS中并不是完美无缺的。虽然单进程的性能表现相当不错,但一个CPU最终还是不够用(由于JS引擎自身的运行原理,NodeJS使用单线程执行JS代码,详见“JS和多线程”)。Node本身并没有扩展能力来充分利用多CPU系统的计算能力。实际上当前版本的NodeJS程序只能在一个上CPU执行,在2.5GHz的英特尔至强处理器下运行HTTP代理服务的性能大约为2100 reqs/s。

虽然Node相对稳定,但它仍然会偶尔崩溃。如果你实用一个单独的NodeJS进程作为服务,崩溃会对可用性造成不良影响。例如段错误、内存越界等错误在用C++编写的程序上相当普遍。如果有多个进程同事处理请求,当一个进程出错退出,传入的请求可以被导向给其他进程。

充分利用多处理器的优势

有如下几种方法可以使NodeJS利用多处理器,每个方法都有自己的优缺点。


使用软件负载均衡

直到node-v0.1.98 ,充分利用多处理器的最佳做法是为每个处理器单独启动一个NodeJS进程,每个进程都运行HTTP服务并绑定到不同的端口。这样需要一个负载均衡软件,将客户端请求转发到各进程,这个软件知道每个服务进程的端口。这样处理性能也不错,但配置管理多进程比较复杂,因此不是最佳方案。

当然,这种架构也有好处,它允许负载均衡软件按照指定的策略将请求路由到不同进程上。(例如,通过IP,通过cookie等)。


使用操作系统内核做负载均衡

在node-v0.1.98中 ,雅虎贡献了一个用于传递和重用文件描述符的核心补丁,允许如Connect和multi-node等HTTP框架使用多个进程同时提供HTTP服务,而且不需要修改原有的程序代码和配置。

概括地讲,这些框架使用的方法是创建一个进程监听端口(比如说监听80端口)。然而,这个进程不是接受Socket连接,而是使用net.Stream.write()将其传递给了其他子进程(其内部是使用sendmsg(2)发送,并使用recvmsg来获取文件表描述符)。每个子进程排队将收到的文件描述符插入自己的事件循环中并在空闲时处理客户端的连接。OS内核本身负责进程间的负载平衡。

重要的是,这实际上是一个高效但没有策略的L4负载平衡器,每个客户端的请求可能被任意一个进程处理。任何处理请求所需的应用程序的状态,都不能像单进程时那样简单的保存在一个NodeJS实例当中。


使用NodeJS转发请求

某些情况下,你可能可能无法使用或者不想使用上述两种方法。例如,负载均衡程序无法按照应用程序所需的路由规则转发请求(如,有复杂应用逻辑的路由规则或者需要SELinux连接信息的路由规则)。在这种情况下,可以使用单个进程接受连接,检查并传递给其他进程处理。

下面的例子需要node-v0.1.100或更高版本以及node-webworker 。node-webworker是新兴的HTML5 Web Workers标准的NodeJS实现,这个标准允许并行执行JavaScript代码。您可以使用npm安装node-webworker,命令如下 npm install webworker@stable。


本文责任编辑: 加入会员收藏夹 点此参与评论>>
复制本网址-发给QQ/微信上的朋友
上一篇文章:Node.JS的编译过程
AI智能听书
选取音色