javaee论坛

普通会员

225648

帖子

344

回复

358

积分

楼主
发表于 2017-07-01 19:40:05 | 查看: 171 | 回复: 2
Node 实现是以非阻塞的I/O事件循环机制文件网络I/O库为中心,以V8 JavaScript解释引擎为基础。

Node的优势是什么

通常的应用服务器端适用阻塞I/O和线程来实现并发。阻塞I/O会导致线程等待,从而造成线程资源的浪费,因为当应用服务器处理请求时,需要等待I/O执行结束才能继续处理。
Node有一个无需I/O等待或执行环境切换的单独执行环境。Node的I/O调用会转换为请求处理函数,当某些数据可用时时间轮询会调度事件让这些函数工作(回调函数)。事件轮询和事件处理程序模型差不多,就像浏览器中的JavaScript一样。程序的执行最好能快速的返回到事件循环中,以便能立即调度一下个可执行的任务。
通过下面的代码来理解和解释上面的定义:

< class="ttyprint"> result = query("select * from db");

上面的代码来自于Ryan Dahl在“Cinco de Node的演讲中。在执行上面的代码时发生了什么
从传统类Java的语言或平台角度来讲,程序的执行过程可能是这样的:
    数据库中间件把这个查询发送到数据库,接着数据库查询结果并返回数据,但是在数据库查询到结果并返回数据期间,程序会暂停执行。设想一下,在某些情况下,查询时间可能很长,相应的程序的暂停时间也会变长,如果这样的耗时查询非常多,将会导致所有线程都处理暂停等待状态(计算机的资源是由限制的),这样新的请求到来时将会被丢弃。同时,线程间执行环境的切换也是一种昂贵的开销(虽然小于进程间的开销),线程越多,CPU存储和恢复状态消耗的时间也越多。此外,在Java这类语言中,每个线程都有自己的执行栈,对内存的消耗也是一笔可观的开销。更让程序员头疼的可能要数多线程程序中对于共享变量的访问问题了,不知道什么时候一个bug就出来了,还基本不能重现~~~(dump一份JVM内存来分析一下吧!!!…^-^)
从Node这样的异步事件驱动的编程模型角度来分析:
    在Node中,上面的代码应该是如下的:

< class="ttyprint"> query("select * frome db", function (result){ // more options });

与Java这样的采用多线程结合阻塞式I/O的平台不同,Node中,查询结果并不是调用函数的结果,而是将查询结果提供给了一个稍后调用的回调函数。上面的代码中,Node将查询请求提交给数据库后控制会立即返回事件循环,而服务器也能够继续处理其他请求,这些在提交数据库查询后新到来的请求中将会有一个对查询的响应请求(由数据库中间件发起请求,通知查询完成,可以响应请求了),控制器将调用响应的回调函数

Node的性能怎么样

关于这个问题可以移步到http://nodejs.org/cinco_de_node.pdf中,这是Node作者RyanDahl演示过的一个简单的基准测试程序,文件里面也详细的罗列出了Node的性能对比于Nginx和Apache的情况。
需要提醒的是,Node应用具备高性能的关键是要快速返回事件循环。如果回调处理程序执行时间“很长”(JavaScript是单线程的,其语言规范中明确指出:一个函数在执行时,不可以被打断,必须执行完这个函数中的所有代码或主动/被动退出程序时,才能执行下一个函数),Node也不是那么的“高性能”了,这样就是为什么我们说Node并不太适用于I/O密集型应用。Node作者也在其博文中,论述了事件处理程序执行时间要小于5秒的必要性。针对于前面的提醒,最后再次提醒大家:这仅仅是一个基准测试,Node有其适用的业务场景,Java也有Java适用的业务场景,需要根据自身的业务场景来选择最佳的技术平台


普通会员

0

帖子

316

回复

322

积分
沙发
发表于 2022-04-22 17:58:27

百因必有果你的报应就是我

普通会员

1540

帖子

311

回复

314

积分
板凳
发表于 2024-04-25 04:58:20

很好

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017