Node.js is the New Black

来源:互联网 发布:利用python数据分析 编辑:程序博客网 时间:2024/05/17 06:09

Programming-July 13,2010-By Louis Simoneau

Node.js is the New Black(Node.js正在起步的新技术)

最近几年如果你关注web技术方面的新闻,你可能至少听到一到两次node.js的名字。接下来发生的事情可能像这样:你问,“这是什么?”有人(或谷歌)告诉你,这是一种使用JavaScript编写web服务器的方式。如果这没有吓跑你,你可能接着问,“你为什么想去使用它?”答案可能是如下:它利用了非阻塞,事件驱动的IO保证了长轮询或基于comet技术应用中的高并发。


到这点上你停止了询问,我不责怪你。下面我尝试打破术语的隔阂,解释什么是node.js以及你为什么要关注它。


一直以来都是这样的过程:浏览器向网站发送请求,站点的服务器接收请求并跟踪请求文件,根据请求执行数据库查询,然后给浏览器回送响应。在传统的服务器(比如Apache)中,每个请求都会使服务器创建一个新的系统进程来处理。


后来有了Ajax,我们不用每次都请求一个新的页面,而是只请求我们想要信息的那一部分。当然,这是一个进步。


但现在你想,你如何建立一个像FriendFeed的服务,每个用户的状态都会实时更新。唯一可行的办法是任何时候让每个用户都和服务器实际连接。目前这么做最简单的方式是通过长轮询(long polling)。


长轮询本质上是让HTTP表现像一个持续连接:页面一加载,它就向服务器发送一个Ajax请求,即使页面没有请求。但是与一般Ajax请求不同,此时服务器不会立即响应而只是等待在那里。当有新东西需要浏览器展示才会回送响应。举例来说,你的朋友添加了一个新贴,服务器回送响应让浏览器更新显示,浏览器收到响应的同时,又向服务器发送一个请求(这样一直有个请求等待在那里)。这样浏览器就像持续在等待服务器的响应(实际非连续模拟出了持续连接状态)。


现在思考一下,这对于像Apache这样的传统web服务器来说意味着什么。对于连接到站点的每个用户,你的服务器都要保持一个打开连接。每个连接需要一个进程,每个进程又要花费大量时间等待(空置消耗内存)或等待数据库查询完成。这意味着高数量的连接很容易耗光你的内存而导致服务器瘫痪。


所以有什么解决办法呢?这时到我们上面提到的术语发挥作用了:特别是非阻塞和事件驱动。在这里这些术语比你担心的要容易理解。非阻塞服务器可以想作一个loop循环:loop不停的循环跑,请求进来,loop抓住它并把他它传递给其他进程(比如数据库查询),再建立回调继续跑下去。它不会在那里等着数据库的返回请求信息。


如果数据库查询返回了--好吧,我们会用同样的方式处理:将响应返回客户机并继续跑loop循环。这样在理论上,你能等待的数据库查询和打开请求的客户机数量没有限制,因为你并没有花时间在等待它们。你在它们自己的时间里处理它们,这就是事件驱动的含义:服务器只有事件发生了才响应。事件可能是一个请求,一个正在加载的文件或一个正在执行的查询,其实这都不重要。


FriendFeed是基于Python写的非阻塞框架称为Tornado(龙卷风)来实现上面说的功能。Nginx web服务器也是这么做的。但是Node.js有一张王牌:因为它使用JavaScript,直接在谷歌变态的V8引擎上跑。你完全不用担心对另一段代码的一个请求是否会导致loop循环的堵塞。原因是JavaScript本质上就是事件驱动的。回想一下:当你在浏览器写JavaScript,你只是给事件加处理和回调函数。其实这就是JavaScript语言的设计方式。


Node.js依然处于起步阶段,所以如果你想写一个基于Node.js的应用,你需要写一些相当底层的代码。但是随着下一代浏览器WebSockets即将到来(不使用长轮询),Node.js技术在web应用中只会越来越重要。我希望我已经让你脑海中有了相关概念并想去开始尝试Node.js。