博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js是新的黑魔法
阅读量:2032 次
发布时间:2019-04-28

本文共 2268 字,大约阅读时间需要 7 分钟。

最近看了很多web系统都用到了node.js。前几天听之前实习的朋友说,将来的趋势就是前后端一统天下,node.js能发挥很大的用武之地。下面是一篇2010的介绍node.js的文章,特别好,结合自己的理解翻译了一下。

Node.js is the New Black (Translate)

作者简介:

Louis joined SitePoint in 2009 as a technical editor, and has since moved over into a web developer role at Flippa. He enjoys hip-hop, spicy food, and all things geeky.

如果你一直在关注去年web technology领域发生的新闻,那么node.js的名字至少会出现你的耳边一两次。接下来你可能会问:“node.js是啥啊?”,那么旁人(或者是谷歌大大)会告诉你:“这玩意是一种用JavaScript写web服务器的方式”。

如果这没有把你吓跑(很多人没有什么搭web的背景,比如我···),那么你很可能会发问:“为啥会想到用node.js呢?”。其优点可能会列出长长的一串:通过非阻塞(non-blocking)事件驱动I/O(event-driven IO),从而在长轮询(long Polling)或comet构建的应用中实现高并发(high concurrency)

假设我们没有啥web背景,下面抛开行话,我尝试着用通俗的方式解释什么是node.js,为什么你要使用它。

我们知道:浏览器发送请求给网站,网站服务器接收来自浏览器的请求,追踪其请求文件(Post 表单),并根据请求进行诸如数据库查询等操作,然后将查询的结果返回给浏览器。

在传统的web服务器中,如Apache,每一次来自浏览器的请求都会使得服务器创建一个新的系统进程来handle这个请求。

后来出现了Ajax,相较于之前每次都请求整个页面,有了Ajax之后,我们只需要请求我们我们真正想要的部分信息。这是一个很好的优化。

现在,如果让你搭建一个类似FriendFeed(类似人人?)的服务:每个用户都可以实时的、任意时刻的上传内容。如果基于刚才的内容,唯一的方式就是使得每个用户与服务器一直保持连接,目前保持持续连接最简单的方式是通过长轮询(long polling)

长轮询本质上使HTTP表现为持久连接(persistent connection): 当加载页面的时候,不管页面需不需要返回数据,它都给服务器发送了一个Ajax请求。但是,不同于普通的Ajax请求,服务器不是直接返回response。除了它有新的内容想让浏览器展示的时候,剩下的时间服务器会wait而不是发送response。

举个栗子:当你的一个朋友发了新的内容,服务器return response to 浏览器,要求它更新展示结果。当浏览器收到response的时候,它会再发送向服务器发送新的request,并等待服务器端是否有新事件发生,并做相应的处理。

现在回到Apache——传统的web服务器。对每个连接到此网站的用户,你的服务器必须始终保证连接是打开的(即不可能关闭连接)。每个连接都需要一个进程来handle,这些进程会消耗大量的时间和内存,并对数据库造成相当的压力。

这意味着如果同时有大量对网站连接请求,服务器很可能会瘫痪,并导致资源用尽。

那么,怎么解决这个问题呢?下面就回到最开始提到的术语了:

non-blockingevent-driven(是不是感觉这些词没有那么可怕了?)。将non-blocking服务器想象为一个圆圈:

这里写图片描述

当请求进入之后,这个圆圈处理请求,并把它传进对应的处理进程(Handler Process)。而不是直接为Request1

、2、3、…都对应创建各自的进程。注意:这种模式不是”坐在那里”,等待诸如数据库查询等操作完成之后再处理下面的请求。

当数据库查询结果返回的时候,我们按同样的方法来做:将response返回给客户端,然后开始循环查找具体是哪个地方发出的这次请求。

理论上,数据库查询等Handle操作数或客户端开发请求的数是没有上限的,因为服务器不需要花费时间来等待处理结果。即:服务器只在用户那边有事件发生的时候才响应,这就是事件驱动(event-driven)

FriendFeed使用了一种基于Python语言的非阻塞框架。

Nginx这种web服务器也是这样的。然而,Node.js有一个王牌:Node.js的应用是通过javascript开发的,然后直接在Google的变态V8引擎上跑。用了Node.js,你就不用担心用户端的请求会导致服务器里一段代码造成阻塞了。因为javascript本质(intrinsically)上是事件驱动的语言。

回想一下,在给前端写javascript的时候,更多时候你都是在做事件处理(event handler)回调函数(callback)。这也是Javascript被设计出的目的。

Node.js还是个新生事物,所以当你想要基于Node.js写应用的时候,还是需要自己做一些low-level的编程。随着下一代WebSockets技术在浏览器中的应用(宣告了长轮询方式的GG),Node.js这种处理请求的,分发任务的方式将会是Web应用中的主流。

希望这篇文章能给你点感觉。

你可能感兴趣的文章