初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境

思考

      首先咱们来思考一个问题:咱们都知道几乎全部现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript。那么咱们就容易认为JavaScript是一种浏览器端的解释型编程脚本。那么脱离了浏览器,JavaScript还可以解释运行吗? 答案是确定的,也就是说脱离了浏览器,在特定环境下JavaScript仍是能运行的。JavaScript向来以Web网页的脚本语言而著称,但如今也能够用在许多非浏览器环境,例如node.js或者Apache CouchDB。本文就是基于NodeJS来进行探讨。前端

    NodeJS是什么?

      根据百度百科解释,Node.js是一套用来编写高性能网络服务器的JavaScript工具包。Node.js是一个能够快速构建网络服务及应用的平台,该平台的构建是基于Chrome's JavaScript runtime,也就是说,实际上它是对GoogleV8引擎(应用于Google Chrome浏览器)进行了封装。V8引 擎执行Javascript的速度很是快,性能很是好。node

      NodeJS并非提供简单的封装,而后提供API调用,若是是这样的话那么它就不会有如今这么火了。Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。例如,在服务器环境中,处理二进制数据一般是必不可少的,但Javascript对此支持不足,所以,V8.Node增长了Buffer类,方便而且高效地 处理二进制数据。所以,Node不只仅简单的使用了V8,还对其进行了优化,使其在各环境下更加给力。web

    Node.js的优势

      一、基于V8虚拟机,可构建高性能服务器数据库

       V8引擎自己使用了一些最新的编译技术。这使得用Javascript这类脚本语言编写出来的代码与用C这类高级语言写出来的代码性能相差无几,却节省了开发成本。对性能的苛求是Node的一个关键因素。 Javascript是一个事件驱动语言,Node利用了这个优势,编写出可扩展性高的服务器。Node采用了一个称为“事件循环(event loop)”的架构,使得编写可扩展性高的服务器变得既容易又安全。提升服务器性能的技巧有多种多样。Node选择了一种既能提升性能,又能减低开发复杂度的架构。这是一个很是重要的特性。并发编程一般很复杂且布满地雷。Node绕过了这些,但仍提供很好的性能。apache

      二、单线程编程

      Node.js能够在不新增额外线程的状况下,依然能够对任务进行并行处理 —— Node.js是单线程的。它经过事件轮询(event loop)来实现并行操做,对此,咱们应该要充分利用这一点 —— 尽量的避免阻塞操做,取而代之,多使用非阻塞操做。后端

      三、可利用Javascript进行后台开发浏览器

      虽然让Javascript运行于服务器端不是Node的独特之处,但倒是其一强大功能。不得不认可,浏览器环境限制了咱们选择编程语言的自由。任何服务器与日益复杂的浏览器客户端应用程序间共享代码的愿望只能经过Javascript来实现。虽然还存在其余一些支持Javascript在服务器端 运行的平台,但由于上述特性,Node发展迅猛,成为事实上的平台。安全

      四、非阻塞IO服务器

      Node采用一系列“非阻塞”库来支持事件循环的方式。本质上就是为文件系统、数据库之类的资源提供接口。向文件系统发送一个请求时,无需等待硬盘(寻址并检索文件),硬盘准备好的时候非阻塞接口会通知Node。该模型以可扩展的方式简化了对慢资源的访问, 直观,易懂。尤为是对于熟悉onmouseover、onclick等DOM事件的用户,更有一种似曾相识的感受。

      五、RESTFUL API

2、为什么接触NodeJS,咱们的问题以及解决方案

      本人如今在IBM公司实习,参与公司云办公系统的项目研发,本人所在项目组主要负责在线电子表格的开发工做。项目前端开发是基于DOJO框架,后台主要基于JAVA。项目功能性开发已经基本完成,可是在实际测试阶段发如今编辑超过必定阈值的大数据的状况下系统开销比较大,运行效率没法知足要求。

      在通过大量跟踪测试及分析后,基于系统的总体架构以及解决该性能问题,咱们有两套解决方案:一、因为如今系统词法解析采用的是开源语法分析器ANTLR,而ANTLR在效率上还略有不足,所以咱们决定基于ANTLR来进行二次开发,寻求一些改进;二、创建前端服务器,和后台服务器进行分离。前端与后台共同维护一致的数据模型,前端服务器主要解决运算方面的请求并将计算结果及时反馈用户,而后将改变发送到后台服务器,由后台服务器进行持久化存盘、消息分发等一些操做。

      因为前端是基于DOJO框架进行的开发,为了最大限度的重用前阶段实现的功能代码来咱们考虑基于NodeJS来搭建前端服务器,并充分利用NodeJS的一些特性来实现系统性能的提升。

3、为什么选择NodeJS

      我想不只仅是Node.js,当咱们要引入任何一种新技术前都必需要搞清楚几个问题:

    • 咱们遇到了什么问题?
    • 这项新技术解决什么问题,是否契合咱们遇到的问题?
    • 咱们遇到问题的多种解决方案中,当前这项新技术的优点体如今哪儿?
    • 使用新技术,带来哪些新问题,严重么,咱们可否解决掉?

      Server端阻塞是当前系统遇到的最大问题。在整个数据查询的过程当中,当前程序进程每每只是在等待结果的返回,这就形成了进程的阻塞。对于高并发、计算任务较大以及I/O密集行的网络应用中,一方面进程很长时间处于等待状态,另外一方面为了应付新的请求不断的增长新的进程。这样的浪费会致使系统支持QPS远远小于后端数据服务可以支撑的QPS,成为了系统的瓶颈。Node一贯是这样来标榜本身的:“在node中除了代码,全部一切都是并行执行的”。这句话的意思是说,Node.js能够在不新增额外线程的状况下,依然能够对任务进行并行处理 。Node.js是单线程的,它经过事件轮询(event loop)来实现并行操做,对此,咱们应该要充分利用这一点 ,尽量的避免阻塞操做,取而代之,多使用非阻塞操做。咱们搭建前端服务器主要用于处理前端大量的公司计算并将计算结果及时呈现给用户,因此可以避免不少I/O阻塞操做,这样就能充分利用NodeJS的优势同时也可以知足咱们的需求。另外,咱们前端基于的DOJO框架是基于JS的,而NodeJS在处理JavaScript的优点在前面已有介绍,这里再也不赘述。

    JS适合解决阻塞问题

      解决阻塞能够引入事件处理机制解决这个问题,在查询请求发起以前注册数据加载事件的响应函数,请求发出以后当即将进程交出,而当数据返回后再触发这个事件并在预约好的事件响应函数中继续处理数据。而JavaScript,相对于其余语言,至少有两个关键特性决定它特别适合完成这个任务。

     (一) JavaScript是一种函数式编程语言,函数编程语言最重要的数学基础是λ演算(lambda calculus) ,即函数对象能够做为其余函数对象的输入(参数)和输出(返回值)。这个特性使得为事件指定回调函数变得很容易。特别是JavaScript还支持匿名函数,经过匿名函数的辅助,咱们很容易实现回调。(二)JavaScript的另一个重要语言特性:闭包(Closures)。该特性可使异步回调的运行上下文保持,即"状态保持"。

4、使用NodeJS带来的问题以及解决方案

       阻塞式编程浪费了大量进程资源只是在等待,致使大量内存和cpu的浪费。在这方面Node.js好不少,但也正是由于一些闭包等JavaScript内建机制也会致使资源的浪费。看下面的代码:

       Js代码:

复制代码
1 function main(){ 
2     var id = "1"; 
3     var str = "..."; //这里局部变量str存储一个2M的字符串 
4     db.query("selcect name from persons where id=" + id,function(name){ 
5         output("person id:" + id + ", name:" + name);//n秒后数据返回后执行回调 
6     }); 
7 } 
8 main();
复制代码
 

 至少整个数据查询过程当中,变量str所使用的2M内存并不会被释放,而str保持下去可能并无意义。前面已经解释过闭包的原理,闭包并无智能到只包起来从此可能被访问到的对象。

相关文章
相关标签/搜索