关于NodeJS的思考
对于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的思考的更多相关文章
- NodeJS&&前端思考
做大型软件(工程化): 1.测试相关 tdd / bdd 测试覆盖率 2.规范化 standard.各种 lint.hint 3.构建相关 gulp.grunt.webpack,大量插件 4.生成器 ...
- 关于mongoDB的思考和nodeJS执行windows系统命令
P1:在cnodejs.org上面看到有人问这个问题: 然后对此产生思考,第一句db.artile.find('uid':id) 然后问后台是否是这样查询,后台告诉我不是,这种写法就是违背非关系型数据 ...
- [转] 基于NodeJS的前后端分离的思考与实践(五)多终端适配
前言 近年来各站点基于 Web 的多终端适配进行得如火如荼,行业间也发展出依赖各种技术的解决方案.有如基于浏览器原生 CSS3 Media Query 的响应式设计.基于云端智能重排的「云适配」方案等 ...
- 实现真正意义上的前后端分离------由淘宝引入nodejs引发的思考
说起前后端分离,大家包括我自己都会想到: 当今流行的MVC不就是最标准的前后端分离吗? 说到这里,我不禁要反问,MVC真正的实现了前后端分离了吗? 无论是PHP的MVC框架TP还是JAVA的MVC框架 ...
- 关于nodejs访问mysql的思考
nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql.安装成功后的访问数据库代码如下: var mysql = require('mysql'); ...
- 关于”nodejs基于事件驱动”的思考
刚想通是怎么回事. 以页面上的js为例,你可以给多个标签注册事件回调,然而,无论给 多少个标签 注册 多少个事件回调,这些回调都只会等待自己命中注定的那个事件,在执行上都不会彼此影响!!! 再想一下w ...
- nodejs 从helloworld到高质量的后台服务server的一点思考
---恢复内容开始--- 新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我 ...
- 图片访问实时处理的实现(nodejs和php)
我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
随机推荐
- C语言学习009:管道连接输入输出
现在我们需要对gpsdata.csv文件中的数据进行筛选,然后将符合条件的数据输出到output.json文件中,第一种方式当然是在之前的代码中进行修改,但是如果我们不想修改原来的代码就能得到我们期望 ...
- PHP表单数据写入MySQL代码
<h1>插入操作</h1> <?php if(!isset($_POST['submit'])){ //如果没有表单提交,显示一个表单 ?> <form ac ...
- 【Java每日一题】201612015
package Dec2016; import java.util.HashSet; public class Ques1205 { public static void main(String[] ...
- FreeBSD pkg仓库有台湾的镜像了
http://pkg.freebsd.org/ 在这个页面上可以看到: pkg0.bme.freebsd.org pkg0.nyi.freebsd.org pkg0.twn.freebsd.org p ...
- IOS----友盟推送详解
这两天好好的研究了下推送这功能,关于它我将分成两部分来讲,一.IOS手机端,二.Servlet服务端,今天先讲下IOS端 一.感受 下面讲下我对推送这个功能在IOS下的感受,这个算是我做了服务端的功能 ...
- python signal信号
作用:发送和接收异步系统信号 信号是一个操作系统特性,它提供了一个途径可以通知程序发生了一个事件并异步处理这个事件.信号可以由系统本身生成,也可以从一个进程发送到另一个进程. 由于信号会中断程序的正常 ...
- [moka同学笔记]三、Yii2.0课程笔记(魏曦老师教程)关联字段增加搜索
关联字段增加搜索 post表关联adminuser表,通过post.author_id adminuser.id关联,在YII2.0生成搜索,关联字段搜索时,需要输入关联字段author的id才能搜 ...
- Android开发跳槽、简历和面试的那些事
年后不久,就迎来了一年一度的招聘旺季,尤其,对于互联网行业来说,近些年的3月份被视为换工作的最高峰,已经没什么可以争议的了. 至今为止,在小组Android开发招聘这块,已经面试有近30人了.最后得出 ...
- rabbitmq心跳机制与配置
最近,我们有些在阿里云上的应用总是有客户端出现异常和信息推送不及时的情况,检查mq日志,发现高峰期不停的有心跳超时,如下: =ERROR REPORT==== 21-Dec-2016::12:38:0 ...
- http gzip 解压缩
var sContentEncoding = httpRespone.Headers["Content-Encoding"]; if(sContentEncoding == &qu ...