Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现)。
但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势?
Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架。nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的 性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方module来实现这个功能)。
这里主要不是介绍nodejs具体应用代码,而是想介绍一下事件驱动编程。
在这篇文章(1)里面,Dan York介绍了两种典型的事件驱动实例。
第一个例子是关于医生看病。
在美国去看医生,需要填写大量表格,比如保险、个人信息之类,传统的基于线程的系统(thread-based system),接待员叫到你,你需要在前台填写完成这些表格,你站着填单,而接待员坐着看你填单。你让接待员没办法接待下一个客户,除非完成你的业务。
想让这个系统能运行的快一些,只有多加几个接待员,人力成本需要增加不少。
基于事件的系统(event-based system)中,当你到窗口发现需要填写一些额外的表格而不仅仅是挂个号,接待员把表格和笔给你,告诉你可以找个座位填写,填完了以后再回去找他。你回去坐着填表,而接待员开始接待下一个客户。你没有阻塞接待员的服务。
你填完表格,返回队伍中,等接待员接待完现在的客户,你把表格递给他。如果有什么问题或者需要填写额外的表格,他给你一份新的,然后重复这个过程。
这个系统已经非常高效了,几乎大部分医生都是这么做的。如果等待的人太多,可以加入额外的接待员进行服务,但是肯定要比基于线程模式的少得多。
第二个例子是快餐店点餐。
在基于线程的方式中(thread-based way)你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你。收银员不能接待下一个人,除非你拿到食物离开。想接待更多的客户,容易!加更多的收银员!
当然,我们知道快餐店其实不是这样工作的。他们其实就是基于事件驱动方式,这样收银员更高效。只要你把点餐单给收银员,某个人已经开始准备你的食 物,而同时收银员在进行收款,当你付完钱,你就站在一边而收银员已经开始接待下一个客户。在一些餐馆,甚至会给你一个号码,如果你的食物准备好了,就呼叫 你的号码让你去柜台取。关键的一点是,你没有阻塞下一个客户的订餐请求。你订餐的食物做好的事件会导致某个人做某个动作(某个服务员喊你的订单号码,你听到你的号码被喊到去取食物),在编程领域,我们称这个为回调(callback function)。
Node.Js做了什么工作呢?
传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什 么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。
相反的,Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用 户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
考虑下面这个过程:
1,你用浏览器访问nodejs服务器上的"/about.html"
2,nodejs服务器接收到你的请求,调用一个函数从磁盘上读取这个文件。
3,这段时间,nodejs webserver在服务后续的web请求。
4,当文件读取完毕,有一个回调函数被插入到nodejs的服务队列中。
5,nodejs webserver运行这个函数,实际上就是渲染(render)了about.html页面返回给你的浏览器。
好像就节省了几微秒时间,但是这很重要!特别是对于需要相应大量用户的web server。
这也就是为什么Node.Js这么热这么惹人关注。而且它还使用了一个非常通用的编程语言Javascript,也让开发者可以快速容易的编写高可扩展性服务器。
相关推荐
Manuel Kiessling是这本书的作者,他以通俗易懂的语言向读者传授Node.js的编程思想和实际操作。这本书是通过Leanpub平台进行销售的,Leanpub使用轻量级的工具并允许多次迭代,以便作者能够获得读者反馈并根据反馈...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行开发,从而打破了JavaScript只能在浏览器端使用的局限。这个"node.js代码"压缩包中可能包含了各种实用的Node.js代码...
操作上,简单易懂的界面设计使得用户上手容易。 4. 概要设计 - 系统功能设计:包括用户注册登录、个人信息管理、论坛发帖回帖、资源上传下载、聊天室等功能。前端主要负责展示和交互,后台处理数据逻辑。 - 数据库...
Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它以其异步非阻塞I/O和事件驱动的模型,为构建高性能网络应用提供了强大的支持。本指南由清华大学学长编撰,旨在为初学者提供一个清晰、易懂的Node.js学习路径...
### Node.js设计模式第二版概览 #### 一、书籍基本信息 - **书名**:《Node.js设计模式》第二版 - **作者**:Mario Casciaro 和 Luciano Mammino - **出版社**:Packt Publishing - **出版时间**:第二版于2016年7...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行开发。Express是Node.js的一个轻量级Web应用框架,它简化了构建Web服务和API的过程。而MySQL则是一种广泛使用的开源...
Node.js的非阻塞I/O模型和事件驱动架构非常适合构建高性能的网络应用,而CoffeeScript的语法糖可以使这一过程更加顺畅。例如,使用CoffeeScript编写Node.js模块和路由处理函数,可以显著提高开发效率。 ### 五、...
- **非阻塞I/O模型**:Node.js采用异步I/O处理方式,这使得它非常适合构建高性能且可伸缩的网络应用。 - **单线程**:尽管Node.js本身是单线程的,但它能够高效地处理并发请求,这是因为其事件驱动机制。 - **丰富的...
Node.js是JavaScript语言的服务器端运行环境,它允许开发者使用JavaScript构建服务器端应用,这在之前一直是其他语言的领域。Node.js的出现,使前端开发者能够用熟悉的语言来开发整个Web应用,包括后端服务。在Node...
Node.js是建立在Chrome V8引擎上的JavaScript运行环境,允许开发者使用JavaScript进行服务器端编程。Node.js具有异步、事件驱动的特性,这使得它在处理高并发I/O操作时表现出色,特别适合用于构建高性能的网络应用,...
《Node.js实战》是一本备受推崇的Node.js入门书籍,对于初学者来说,它提供了全面且易懂的Node.js知识体系。Node.js是一款基于Chrome V8引擎的JavaScript运行环境,以其异步、非阻塞I/O和事件驱动的特性,为开发高...
这种方式简单易懂,但可能导致阻塞,特别是在处理I/O密集型任务时,会严重影响程序性能。例如: ```javascript console.log('Start'); for (let i = 0; i ; i++) {} console.log('End'); ``` 这里的循环是同步的,...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这个文档的目标是帮助那些对Node.js和“高级”JavaScript不太熟悉的开发者快速上手,构建应用程序。内容不仅...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,让JavaScript能够在服务器端运行,并提供丰富的API用于处理各种任务,如文件系统操作。本文将对Node.js文件系统模块进行解析,讲解异步和同步操作文件的方法,...
其中,Node.js 作为一款基于 Chrome V8 引擎的 JavaScript 运行环境,在近年来备受开发者们的青睐。它允许开发者使用 JavaScript 开发服务器端的应用程序,并以其高性能、高并发处理能力著称。 #### 二、《Learning...