为什么要使用Node.js

这是一篇几个月前转发量特别大的博文:

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。

NPM是一组公开的,可重用的组件,可通过在线存储库方便安装,具有版本和依赖管理。封装模块的完整列表可以在网站https://npmjs.org/查询,或使用NPM CLI 工具自动获取,任何人都可以发布自己的模块。

一些最流行的NPM 模块:
Express.js ,Node.js的一个Sinatra风格的Web开发框架,成为事实上的标准。

connect连接 - 是Node.js的一个可扩展的HTTP服务器框架,提供了被称为中间件高性能的“插件”的集合,可作为Express的基础。

socket.io和sockjs - 是两种最常见的WebSockets组件。

Jade翡翠 - 一个广受欢迎的模板引擎,灵感来自HAML,成为Express.js默认配置。

MongoDB和mongojs - MongoDB提供的API。

Redis客户端库。

CoffeeScript - CoffeeScript编译器允许开发人员使用Coffee来写自己的Node.js程序。

underscore (lodash, lazy) - 在JavaScript中最流行的实用程序库,与Node.js打包使用,承诺通过采取略有不同的实现方法更好的性能。

forever - 让您的Node.js在生产中避免任何意外故障。


Chat聊天:
http://net.tutsplus.com/tutorials/javascript-ajax/real-time-chat-with-nodejs-socket-io-and-expressjs/

虽然实时应用程序是Node.js真正的亮点,也自然地适合于DB对象(如MongoDB)暴露数据。 JSON格式的数据允许Node.js无需任何引发阻抗不匹配的数据转换(JSON是天然Javascript)。例如,如果你正在使用Rails,你需要实现JSON与二进制模型转换,使用Node.js可以非常简单直接地暴露你的JSON对象,提供消费客户一个REST API。

此外,如果从数据库中读取或写入时(MongoDB)您不必担心JSON和其他任何转换之间。总之,你可以通过使用一个统一的数据序列化格式,实现跨客户端以及服务器和数据库,从而避免多次转换。

如果您需要一个高并发访问量,你的数据库可能成为瓶颈。诚如上文所述, Node.js可以轻松地处理并发连接。但由于数据库访问是一个阻塞操作(在这种情况下) ,因为麻烦在于在数据被真正写入到数据库中之前要得到客户端确认,这时我们力求避免客户端并不需要对数据写入成功进行确认,那么NodeJS将十分有用。

比如最终一致性(经常在NoSQL世界中使用)如果是可以接受的。数据写入是通过某种缓存或消息队列基础设施的排队(如RabbitMQ的, ZeroMQ ),然后再通过一个单独过程批量写入数据库。这些方式下都能够获得更高的吞吐量。