这是一篇几个月前转发量特别大的博文:
Node.js闪耀点是:它是一个基于WebSocket推送技术的实时web应用程序。
为什么说这和革命性有关?在过去的20多年内无状态Web都是基于无状态的请求 - 响应范式,今天我们终于有了实时且双向的连接的Web应用。
在NodeJS中,客户端和服务器互相发起通信,使他们能够自由地交换数据。与此形成鲜明对比的是典型传统的web响应模式,客户端总是要先启动通信,
此外,NodeJS是基于标准端口80以及开放的网络协议栈(HTML,CSS和JS)上运行。可能有人会说,我们已经有Flash和Java等多种形式的小程序,但在现实中,那些将Web作为传输协议传递到客户端的技术只是一种沙盒环境。此外,他们在运行隔离和操是经过非标准端口,这可能需要额外的权限和处理。
NodeJS它的真正意义是,它不是银弹,不一定是那种将主导Web开发的世界的平台。相反,它是符合特别需要的一个平台。
当然你不要希望使用Node.js作为CPU密集型操作,事实上,使用它进行繁重的计算将撤销其几乎所有的优点。NodeJS的真正的亮点是build一个可扩展的网络应用程序速度很快,因为它能够处理庞大的高吞吐量,这意味着高可扩展性的同时在线连接数。
Nodejs引擎的工作原理是相当有趣的。相对于传统的网络服务技术,每个连接(请求)生成一个新的线程,占用了大量系统内存,最终可能耗尽所有可用的RAM内存。Node.js运行是一个单线程,使用非阻塞I/ O调用,能支持数以万计的并发连接(在事件循环持有)。
快速计算:假设每个线程可能需要2 MB内存,如果运行8 GB的RAM上,最大理论值4便是000个并发连接,加上线程之间的上下文切换成本。这就是使用传统的网络服务技术的情况。而 Node.js可扩展性水平是能够达到1M以上并发连接(作为一个证明了概念) 。
有一个问题,所有客户端共享的请求之间使用的是单个线程,它是Node.js应用程序的一个潜在的缺陷。大量的计算可能暂停这个单线程,造成的问题可能影响所有客户端(后面将详细讨论)的请求,直到这个繁重计算完成或被阻止。其次,开发人员需要非常小心,不要让一个Exception例外跑出Node.js的事件循环核心(最顶层) ,这将导致Node.js的实例终止(有效的程序崩溃) 。用来避免异常向上冒泡到表面的技术是将错误作为回调函数传递给调用者,而不是像在其他环境中抛出他们。即使一些未处理的异常冒泡了,也有多个模式可用于监视节点,并执行一个崩溃的实例所需的恢复工作(虽然你将无法恢复用户的会话) ,最常见的是Forever模块,或者采用不同的方法与外部系统工具upstart和monit。