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,也让开发者可以快速容易的编写高可扩展性服务器。
(1) http://code.danyork.com/2011/01/25/node-js-doctors-offices-and-fast-food-restaurants-understanding-event-driven-programming/
分享到:
相关推荐
Node.js,作为一个基于Chrome V8引擎的JavaScript运行环境,自其诞生以来,就以其高效、异步非阻塞I/O以及事件驱动的特性,迅速在Web开发领域崭露头角。本资料将带你深入探索Node.js的核心思想,并剖析其背后的libuv...
* 学习曲线陡峭: Node.js 的异步机制和事件驱动机制需要开发者具备一定的编程基础和经验。 * 不适合计算密集型应用程序: Node.js 不适合计算密集型应用程序,因为它的单线程模型限制了其计算性能。 Node.js 是一...
2. **事件驱动编程**:Node.js的核心是事件循环和回调函数,书中会详细解释如何处理异步操作,以及如何避免回调地狱。 3. **非阻塞I/O**:Node.js通过非阻塞I/O模型实现了高并发,书中会讲解这一特性背后的原理及其...
1. **事件驱动编程**:Node.js采用事件驱动模型,当有I/O操作时,不会阻塞主线程,而是通过回调函数处理。这种设计使得Node.js能够处理大量的并发请求,适合构建高并发的服务器端应用。 2. **V8引擎**:Node.js使用...
- **事件驱动**:Node.js 使用事件驱动编程模型,基于Chrome V8引擎,高效处理大量并发连接。 - **非阻塞I/O**:通过异步I/O操作,Node.js 可以处理大量并发请求,无需等待单一I/O操作完成,提高了系统效率。 - *...
Node.js 使用了一个事件驱动、非阻塞 I/O 模型,使其轻量又高效,非常适合构建数据密集型的实时应用。 标题中提到的“node.js 中文安装包”可能是指包含了中文语言支持的 Node.js 版本。这为中文用户提供了更加友好...
1. **事件驱动编程**:Node.js的核心就是事件循环和回调函数,理解如何处理异步操作是学习Node.js的基础。 2. **模块系统**:Node.js使用模块化设计,每个`.js`文件都可以视为一个模块,通过`require`和`exports`或`...
对于初学者,了解Node.js的基础知识,如模块系统、异步编程、事件循环,以及如何使用npm安装和管理依赖,是十分重要的。 在压缩包“Welcome to Node.js v14.17.6”中,可能包含有以下内容: 1. 安装程序:用于在...
Node.js是基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O、事件驱动的特性在服务器端编程领域独树一帜,尤其适合构建高性能的网络应用。本书通过115个关键技巧的讲解,全面覆盖了Node.js的基础到高级应用...
讲解可能包括了JavaScript在Node.js中的异步非阻塞I/O模型,事件驱动编程的概念,以及如何安装和设置Node.js环境。 2. **模块系统**:Node.js拥有强大的模块系统,如内置模块(如fs、http)和第三方模块(如Express...
Node.js的核心特性包括其非阻塞I/O模型和事件驱动设计,这些都使得它在处理大量并发连接时表现出色。书中会详细介绍这些概念,帮助读者理解Node.js为何在实时应用和数据密集型应用中备受青睐。 Node.js的模块系统是...
Node.js采用单线程、事件驱动的非阻塞I/O模型,使其在高并发场景下表现出色,特别适合构建实时通信应用,如聊天服务、协作工具等。 在本书中,你将学习到: 1. **基础篇**:首先会介绍Node.js的基础知识,包括安装...
- **事件驱动模型**:Node.js的核心设计是基于事件驱动的非阻塞I/O模型,这种模型使得Node.js能够高效处理大量并发请求。 - **模块系统**:Node.js内置了强大的模块系统,使用`require`函数可以加载和使用模块,如...
4. 实践事件驱动编程和异步处理。 5. 了解如何调试和优化Node.js应用。 总之,这个源代码集合是学习和提升Node.js技能的宝贵资源,通过实践和探索,你将能更好地掌握Node.js的核心概念和技术,并能应用于实际项目中...
Node.js作为一款基于Chrome V8引擎的JavaScript运行时环境,其最显著的特色之一就是事件驱动架构。这种架构允许Node.js高效地处理并发请求,并在不阻塞主线程的情况下执行I/O操作。在深入理解Node.js的事件驱动机制...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程,打破了JavaScript只能在浏览器中运行的传统。这个资料包包含了五本关于Node.js的电子书籍,涵盖了从基础到进阶...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了前后端一体化的开发模式。Node.js 使用了一个事件驱动、非阻塞I/O模型,使其轻量又高效...
Node.js通过事件驱动、非阻塞I/O模型,使其轻量且高效,非常适合构建数据密集型的实时应用。 在"node-v21.0.0.tar.gz"这个压缩包中,包含了Node.js的源码,版本为21.0.0。解压后,我们可以深入理解Node.js的核心...