对于NodeJS来说传统程序员比较陌生,初看以为是什么前端框架,其实并不是前端框架。传统的Javascript只能跑在浏览器中,但是一位叫Ryan Dahl的开发者灵感一来,为什么Javascript不能运行在服务端呢?然后经过思考后他决定将Javascript带到后端,在苦苦寻觅中发现谷歌的V8引擎来运行Javascript是很高效的,但是仅仅有浏览器端Javascript是不能构建出强大后端应用的,所以他移除了不必要的浏览器端的特征后又为Javascript添加入了更强大的API,这个API就是后来推荐的CommonJS标准。CommonJS包含操作IO、DataBase、OS相关API(图1-2;摘自《Node.js 开发指南》)。

Ryan Dahl思考现在的IT系统常常遇到C10K问题,为什么会出现这个问题呢?是因为传统的后端业务常常以线程为单位进行执行的,而线程大量创建会导致系统资源不足,以及在IO操作时CPU的闲置引发的开销。Ryan Dahl发现JS的异步-回调模式很好的解决IO操作的导致CPU闲置开销问题,当在执行IO操作时CPU可以继续执行其他业务,IO操作完成后回调继续由CPU接着执行。从而保证CPU的资源不浪费(图1-1;摘自《Node.js 开发指南》)。


         

Ryan Dahl所设计的NodeJS是一个单线程异步IO模型执行机制的服务端程序。IO操作将会交给专用的工作线程处理,回调的方法将插入主线程队列,因为NodeJS是单线程模型,面向CPU操作的业务都会排队在主线程中执行。这也恰恰是NodeJS的弱点,如果CPU操作的业务时间太长,将会影响其他业务,不过还好目前已经有解决方法了,例如:“threads-a-gogo”模块。NodeJS不知道为什么无法使用TryCatch捕获回调内部异常,这问题将导致程序调试时的复杂性,同时会引发整个崩溃重启,不过目前第三方已经实现捕捉内部异常,例如:“domain”模块,但还是无法避免崩溃重启。NodeJS的中可能出现过多的回调函数也是一个头痛的问题,这样会导致代码的可维护性下降,不过目前“Promise”模块已经基本解决嵌套带来的阅读问题,“Promise”通过一套巧妙的回调接口能够平行性进行接连操作,防范过多的嵌套问题,而“Promise”的思想也开始影响AJAX相关的前端库。Ryan Dahl在设计NodeJS引入NPM方便社区协作,使得NodeJS的功能的迭代速度进一步加快。同时NodeJS自身集成了Server方便敏捷开发和部署。NodeJS还可以做其他软件,不仅局限于Web端(图3-1;摘自《Node.js 开发指南》)。

虽然NodeJS目前优点明显,缺点也明显,但是他恰恰有PHP无法比拟的优势。尤其是在高并发IO类业务时体现的淋淋尽致。如果NodeJS能解决单线程与异常捕捉与异步业务的开发的门槛和维护复杂度等问题。相信不久将来会是替代PHP的最佳良品。  

以上截止仅供发文时总结,随着NodeJs版本快速迭代会有很大变化。

关于NodeJS的思考的更多相关文章

  1. NodeJS&&前端思考

    做大型软件(工程化): 1.测试相关 tdd / bdd 测试覆盖率 2.规范化 standard.各种 lint.hint 3.构建相关 gulp.grunt.webpack,大量插件 4.生成器 ...

  2. 关于mongoDB的思考和nodeJS执行windows系统命令

    P1:在cnodejs.org上面看到有人问这个问题: 然后对此产生思考,第一句db.artile.find('uid':id) 然后问后台是否是这样查询,后台告诉我不是,这种写法就是违背非关系型数据 ...

  3. [转] 基于NodeJS的前后端分离的思考与实践(五)多终端适配

    前言 近年来各站点基于 Web 的多终端适配进行得如火如荼,行业间也发展出依赖各种技术的解决方案.有如基于浏览器原生 CSS3 Media Query 的响应式设计.基于云端智能重排的「云适配」方案等 ...

  4. 实现真正意义上的前后端分离------由淘宝引入nodejs引发的思考

    说起前后端分离,大家包括我自己都会想到: 当今流行的MVC不就是最标准的前后端分离吗? 说到这里,我不禁要反问,MVC真正的实现了前后端分离了吗? 无论是PHP的MVC框架TP还是JAVA的MVC框架 ...

  5. 关于nodejs访问mysql的思考

    nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql.安装成功后的访问数据库代码如下: var mysql = require('mysql'); ...

  6. 关于”nodejs基于事件驱动”的思考

    刚想通是怎么回事. 以页面上的js为例,你可以给多个标签注册事件回调,然而,无论给 多少个标签 注册 多少个事件回调,这些回调都只会等待自己命中注定的那个事件,在执行上都不会彼此影响!!! 再想一下w ...

  7. nodejs 从helloworld到高质量的后台服务server的一点思考

    ---恢复内容开始--- 新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我 ...

  8. 图片访问实时处理的实现(nodejs和php)

    我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...

  9. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

随机推荐

  1. 两个dropDownList和一个GridView的选择与显示

    很久没有写ASP.NET了,今天有看到论坛上一个问题:"两个dropDownList和一个GridView,已经进行了数据绑定,现在想让第一个下拉菜单的数据改变时,第二个下拉菜单自动变到相应 ...

  2. Think PHP项目在阿里云的虚拟主机上部署

    购买完万网的虚拟主机后,今天终于把以前一个项目转成了PHP项目,我用的是TP框架,阿里的虚拟主机还是很方便上手的,在把数据库导入完后,用FTP把程序文件上传到服务器上,阿里的虚拟主机(Linux主机) ...

  3. SQL查询中in、exists、not in、not exists的用法与区别

    1.in和exists in是把外表和内表作hash(字典集合)连接,而exists是对外表作循环,每次循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的,如果查询的两个表大小 ...

  4. 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...

  5. mysql,命令导入\导出表结构或数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...

  6. Centos压缩与打包

    这个虽然是基础知识,但是有些东西就是这样,久了没用,就会忘记,而且之前有一个坏习惯就是不喜欢做笔记,以后学习了行东西一定要记录在博客,这样以后自己也能时不时的查看一下. 言归正传,在计算机的世界中,数 ...

  7. IOS----友盟推送详解

    这两天好好的研究了下推送这功能,关于它我将分成两部分来讲,一.IOS手机端,二.Servlet服务端,今天先讲下IOS端 一.感受 下面讲下我对推送这个功能在IOS下的感受,这个算是我做了服务端的功能 ...

  8. 《Java4Android》视频学习笔记——抽象类和抽象函数

    抽象函数的语法特征 1.类是抽象的,对象是具体的.面向对象里面有个非常重要的特征:先抽象,后具体. 2.只有函数的定义,而没有函数体的函数叫做抽象函数. abstract void fun(); ( ...

  9. 【Effective Java】12、避免过度同步

    这里有一个辅助基础类 package cn.xf.cp.ch02.item16; import java.util.Collection; import java.util.Iterator; imp ...

  10. 自定义开关ToggleButton的使用

    [代码]: toggleMe.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override p ...