`
ender
  • 浏览: 43114 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Node.js : 我只需要一个店小二

阅读更多

刚刚开始接触Node.js时, google了很多文章,但发现大部分都是泛泛的介绍安装,配置,以及介绍几个小例子

有一种雾里观花的感觉,所以非常困惑,不知道Node.js到底解决了什么问题,它的优势到底在哪儿,为什么这么火。

 

经过了一番学习之后, 自认为对Node.js的基本原理有了些了解, 于是杜撰了下面这个故事,希望对大家有所帮助,能给大家一点启发

 

 

美丽的七侠镇上有一条美食街,很多著名的饭店都开在这里,有老字号的Apache, PHP, 最近几年火热的Ruby on Rail ,
还有那些重量级的餐饮集团Websphere, Weblogic 等。

这些饭店老板根据自己的实力,或多或少的雇佣了一些店小二来招待来客,这些小二干活都非常殷勤,没有一个偷懒耍滑,把顾客招待的舒舒服服, 所以平日里饭馆运转的还不错,相安无事。

但是随着七侠镇旅游业开发,游客像潮水一样蜂拥而至, 现有的店小二招待不过来了, 到了饭点,每家的门前都排起了长队,游客们吃不上饭,个个怨声载道。


看到这种情况,有些老板咬了咬牙,在人工费不断上涨的情况下, 多雇了一些小二来帮忙, 无奈总是赶不上顾客增长的速度。

 

某一天有个美国老外来到七侠镇上旅游, 也看到了吃不上饭的问题,他仔细分析了一番后发现了一个秘密: 原来这些店都采用了同一套叫做“全程贴心服务”的模式, 这个模式很有意思:

客人来了以后,马上有个店小二殷勤迎上去,带着找座位,点菜,给后厨下单

由于后厨做菜需要很长时间,店小二就在客人的旁边等着。

后厨大喊一声:上菜,店小二马上端到客人面前, 然后站在一边等着客人吃完

客人说:结账,小二收钱,找钱,送客, 迎接下一位。

通常这个时候门口都排成了好几百人了

 

实在是太贴心了! 导致的结果很明显,饭店有几个店小二,就只能同时接待几个顾客。

(当然,现实中是没有饭店是这么做的,否则就等着关门吧)

 

老外一声不吭的回去了。

过了几个月, 美食一条街上出现了一个巨火无比的饭馆: Node.js

虽然这个饭店中人满为患, 可门口竟然没有排队的

更让人吃惊的是,这个店里声称: 我只需要一个店小二!

 

Node.js这个美国老外开的饭店确实只用了一个店小二, 只不过这个小二干活的方式与众不同,他把所有的工作分为两类

(1) 马上就能干完的,例如迎客,点菜,找座,下单 等等

(2) 需要等待别人干完才能干的活,例如上菜,结账等

对(1) 这个小二马上干活

对(2) 店小二不会等待,他只是说,你弄完了告诉我一声,我会接着干, 然后马上去做第一类工作

 

客人来了以后,这个店小二殷勤迎上去,带着找座位,点菜,给后厨下单

由于后厨做菜需要很长时间,店小二闪电般的离开,去干别的活了,可能是迎客,点菜,找座等,总之是那些不用等待,迅速干完的活

后厨大喊一声:上菜,这个小二马上端到客人面前,然后离开,干其他活

客人说:结账,小二收钱,找钱,然后还是迅速闪人,干其他活

 

 

这个唯一的店小二的能力被发挥到了极致,一刻不停,闪电般的在饭店里跑来跑去,因为老板明确的告诉他: 不要等!

Node.js饭店的基础设施很强大,一旦那些耗时的操作完成,店小二立刻就能知道,飞奔过来马上接着干,如果遇到新的耗时的操作,小二毫不留情的离开。

就这么简单, Node.js饭店火了,它同时接待客人的数量大大增加,而服务质量保持基本不变。

 

OK,这是我杜撰出来的一个不成熟的故事,帮助我来理解Node.js的特点:只用一个线程来处理所有请求,事件驱动编程

如果我们回过头来再以计算机的视角看一下会更加清楚:

店小二: 线程

顾客:http请求

第一类工作(迎客,找座,下单) : 在服务器端的代码,能够快速执行

后厨做菜,客人吃饭: 耗时的I/O 操作

后厨大喊一声:上菜 : 这是一个长时间I/O 操作完成的后所发出的事件

客人说:结账: 另外一个长时间I/O 操作完成的后所发出的事件

第二类工作(上菜,结账) : 同样是能快速执行的代码,但是他们需要等待那些耗时的I/O 操作完成才能开始,确切的来说,收到了系统发出的事件以后才开始执行。在Node.js中实际上是在回调函数中来执行的

 

下面是Node.js服务模式的伪代码:

迎客();
找座();
下单();
后厨处理("做菜完成事件", function(){
    上菜处理;
    客人吃饭("吃饭完成事件",function(){
        结账处理;
        送客();
    });
});

需要引起注意的是:

1. 后厨处理()这个函数接受两个参数,一个是事件名,另外一个是匿名的回调函数,事件发生,回调函数才会执行。

    客人吃饭()函数也是类似。

    Node.js 使用的javascript作为服务器端的编程语言,这种回调的方式对于javascript程序员来说,是非常自然的事情,同时从代码的角度来讲,也显得非常清晰。

    另外Node.js使用Chrome的V8引擎来执行javascript,效率非常高

2. 我们能不能把代码写成这样?

迎客();
找座();
下单();
后厨处理("做菜完成事件", function(){
    上菜处理;    
});
客人吃饭("吃饭完成事件",function(){
     结账处理;
});
送客(); 

    肯定不行!, 因为Node.js执行"后厨处理()"函数时,只是安插了一个匿名的回调函数在那里,并不会等待(非阻塞I/O),反而马上 会执行“客人吃饭()"函数,所以上述的写法会引起逻辑上的错误:还没上次就开始吃饭了!

所以写惯了”顺序阻塞I/O“的我们需要改变一下思维方式,进入到事件驱动的世界中来。

 

3. 如果某个操作例如“上菜处理” 是个CPU密集型的计算任务,Node.js那个唯一的线程就会忙于执行这个计算任务而被Block 住,就无法响应其他的请求了,带来的后果很严重,整个服务器都无法响应了!  这个时候,需要考虑把这样的代码进行异步处理

 

 

这里我只是粗浅的讨论了Node.js的原理, 哪位同学要想亲自动手试一试的话,这里是一篇非常好的Node入门文章:Node入门

另外还有两篇深入介绍的文章,非常值得一读(虽然是英文的)

理解Node.js 事件循环

理解Node.js

 

 

后记: 第一次看到Node.js, 确实挺吃惊的, 把javascript 作为服务器端的编程语言,只用一个线程来处理所有请求!

它的作者Ryan Dahl 确实敢想敢干, 再一次体现了美国人的创新精神,非常值得我们学习。

中国的程序员也需要反思一下,我们为什么没有想到? 我们为什么没有做出来?

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Node.js-深入理解Node.js核心思想与源码分析

    Node.js,作为一个基于Chrome V8引擎的JavaScript运行环境,自其诞生以来,就以其高效、异步非阻塞I/O以及事件驱动的特性,迅速在Web开发领域崭露头角。本资料将带你深入探索Node.js的核心思想,并剖析其背后的libuv...

    Node.js-收集最棒的node.js模块这些模块可扩展node.js应用程序的功能

    Node.js作为一个开源、跨平台的JavaScript运行环境,它在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。本文将深入探讨一些优秀的Node.js模块,这些模块可以帮助开发者扩展其应用程序的功能,提升...

    Node.js来一打 C++ 扩展.源码

    C++扩展作为Node.js的模块,需要遵循特定的接口定义,如`init`函数,用于初始化模块,并通过`Nan`库(Nano JavaScript)或`v8`库暴露API给JavaScript调用。 2. **Nan库**: Nan是一个用于简化V8 C++ API使用的库,...

    Node.js: JavaScript based framework. Easy Guide Book

    Node.js: JavaScript based framework. Easy Guide Book by Rick L. English | April 13, 2016 | ASIN: B01E8KVNVW | 75 Pages | AZW3/MOBI/EPUB/PDF The following topics are discussed in this book:  A ...

    Node.js(node-v16.15.1-win-x64.zip)

    Node.js 是一个用于可扩展服务器端和网络应用程序的软件平台。Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度...

    Professional Node.js Building Javascript Based Scalable Software

    出版,为读者提供了一个深入学习Node.js及其核心概念的机会。 #### 第一部分:介绍与设置 - **安装Node.js**(第1章) - 安装过程涵盖了不同操作系统下的步骤。 - 讨论了Node.js的版本管理工具如`nvm`(Node ...

    Node.js开发-Node.js入门.pdf

    Node.js 是一个基于 JavaScript 的服务器端运行平台,允许开发者使用 JavaScript 语言来编写服务器端应用程序。 Node.js 的出现使得 JavaScript 成为服务器端脚本语言。 Node.js 的主要特点是非阻塞 I/O 和事件驱动...

    node.js 12.16.1安装+yarn安装.zip

    Node.js 是一个开源的、跨平台的 JavaScript 运行环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 的核心特性是其非阻塞I/O模型和事件驱动的架构,这使得它非常适合构建高性能的网络应用,如实时聊天、...

    node.js14.18.3版本下载

    Node.js 是一个开源、跨平台的 JavaScript 运行环境,它允许开发者在服务器端执行 JavaScript 代码。Node.js 使用 V8 引擎,这是 Google 为 Chrome 浏览器开发的高性能 JavaScript 和 WebAssembly 引擎。Node.js 的...

    Welcome to Node.js v14.17.6..zip

    Node.js 是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。标题“Welcome to Node.js v14.17.6”表明我们将探讨的是Node.js的特定版本——v...

    前端 - node.js 16.12.0

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript,极大地推动了前端开发的进步。版本 16.12.0 是 Node.js 的一个重要更新,包含了多项性能优化和新特性的引入,...

    Node.js(node-v16.15.1.pkg)

    Node.js 是一个用于可扩展服务器端和网络应用程序的软件平台。Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度...

    Node.js英文书籍2015出版共9本(一次下载)

    Node.js英文书籍2015出版共9本,打包成一个档,以节省大家的时间。 Full Stack Javascript - Learn Backbone.js, Node.js and MongoDB (APress 2015).epub Learning Node.js for Mobile Application Development ...

    安装node.js.doc

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。安装 Node.js 需要注意以下几点: Node.js 简介 Node.js 是运行在服务端的 JavaScript,...

    node.js 安装包 10.16.3-x64

    Node.js 是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。10.16.3-x64 版本是 Node.js 的一个稳定版本,适用于64位操作系统。下面将详细...

    [电子书] Node.js 高级编程 (英文版)

    ☆ 资源说明:☆ [Microsoft Press] Node.js 高级编程 (英文版) [Wrox] Professional Node.js : Building Javascript Based Scalable Software (E-Book)

    linux安装node.js.pdf

    Node.js是一个基于JavaScript的runtime环境,提供了一个事件驱动、非阻塞I/O模型,使得开发者可以轻松地构建高性能的网络应用程序。 在Linux系统中安装Node.js需要经过以下步骤: 1. 从Node.js官网下载Node.js...

    node.js官方v14.17.3-x64版本msi安装包【集成npm】

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者在服务器端使用 JavaScript 进行编程。v14.17.3 是 Node.js 的一个稳定版本,针对 x64(64位)架构设计。集成的 npm (Node Package Manager)...

    node.js(v16.16.0) 安装包

    Node.js 是一个开源、跨平台的 JavaScript 运行环境,它让开发者可以在服务器端执行 JavaScript 代码。Node.js 使用了 Google V8 引擎,这个引擎是为 Chrome 浏览器设计的,因此 Node.js 具有高性能和高效性的特点。...

    Node.js入门教程.pdf

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者使用 JavaScript 语言来编写服务器端代码。Node.js 的出现改变了传统的 Web 开发模式,使得开发者可以使用 JavaScript 语言来开发服务器端...

Global site tag (gtag.js) - Google Analytics