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是基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O、事件驱动的特性在服务器端编程领域独树一帜,尤其适合构建高性能的网络应用。本书通过115个关键技巧的讲解,全面覆盖了Node.js的基础到高级应用...
Node.js的核心特性包括其非阻塞I/O模型和事件驱动设计,这些都使得它在处理大量并发连接时表现出色。书中会详细介绍这些概念,帮助读者理解Node.js为何在实时应用和数据密集型应用中备受青睐。 Node.js的模块系统是...
本书的核心内容围绕JavaScript的非阻塞I/O模型,利用Node.js的异步事件驱动架构,来实现高性能的网络应用。以下是基于标题、描述和标签所涵盖的多个关键知识点的详细解释: 1. **Node.js基础**:Node.js是一个基于...
对于初学者,了解Node.js的基础知识,如模块系统、异步编程、事件循环,以及如何使用npm安装和管理依赖,是十分重要的。 在压缩包“Welcome to Node.js v14.17.6”中,可能包含有以下内容: 1. 安装程序:用于在...
1. **Node.js基础**:Node.js是什么,它的事件驱动模型,非阻塞I/O,V8引擎以及单线程与异步编程的概念。了解这些基础知识有助于理解Node.js的工作原理。 2. **模块系统**:Node.js的模块化设计是其强大之处,学习...
Node.js采用单线程、事件驱动的非阻塞I/O模型,使其在高并发场景下表现出色,特别适合构建实时通信应用,如聊天服务、协作工具等。 在本书中,你将学习到: 1. **基础篇**:首先会介绍Node.js的基础知识,包括安装...
- **事件驱动模型**:Node.js的核心设计是基于事件驱动的非阻塞I/O模型,这种模型使得Node.js能够高效处理大量并发请求。 - **模块系统**:Node.js内置了强大的模块系统,使用`require`函数可以加载和使用模块,如...
由于其非阻塞I/O模型和事件驱动特性,Node.js在处理高并发请求时表现出色,广泛应用于实时通信、API开发、文件处理等领域。 在书中,李锴首先会引导读者安装和配置Node.js环境,理解其核心概念,如模块系统、...
其次,Node.js的一大特点是其事件驱动、非阻塞I/O模型,这是使其在处理高并发请求时表现出高效性能的关键。书中会详细解释这种异步编程模型,并通过实例演示如何编写异步代码,如使用回调函数、Promise以及现代的...
4. 实践事件驱动编程和异步处理。 5. 了解如何调试和优化Node.js应用。 总之,这个源代码集合是学习和提升Node.js技能的宝贵资源,通过实践和探索,你将能更好地掌握Node.js的核心概念和技术,并能应用于实际项目中...
Node.js作为一款基于Chrome V8引擎的JavaScript运行时环境,其最显著的特色之一就是事件驱动架构。这种架构允许Node.js高效地处理并发请求,并在不阻塞主线程的情况下执行I/O操作。在深入理解Node.js的事件驱动机制...
`EventEmitter`类是Node.js内置的事件处理类,常用于实现事件驱动编程。 ### 5. 异步IO操作 Node.js的异步I/O是通过回调函数来实现的,避免了阻塞主线程,提高了程序的运行效率。`fs`模块提供了文件系统的异步操作...