关于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模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
随机推荐
- The Web server is configured to not list the contents of this directory.
部署一个ASP.NET MVC网站至一个全新的服务器Windows Server 2008 R2, 数据为MS SQL Server 2014 64bit Expression版本. 运行时,它第一次 ...
- Winform开发框架中实现信息阅读状态的显示和存储
在很多项目中,可能会有要求对一些数据的阅读状态进行记录,用户阅读过或者未阅读过,都做不同的标识,方便了解数据的状态.如在我的客户关系管理系统中,对于客户的状态进行跟踪,如果最近联系时间超过配置天数的, ...
- 自己实现简单Web服务器,支持GET POST请求
最近项目上遇到一个需求,最后想到的解决方案是自己实现一个web服务器去处理请求,然后再将信息发送到另外一个程序.然后返回处理之后的结果呈现出来. 现在我就来分享一下如何实现的. 通过.NET 为我们提 ...
- 【C#】妈妈再也不用担心自定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚
------------------更新:201411190903------------------ 经过思考和实践,发现套路中的第1条是不必要的,就是完全可以不用定义一个名为Default+属性名 ...
- Oracle 数据泵导入导出
imp zminfo/zminfo fromuser=zminfo touser=zminfo file=E:\zBONDDT.dmp log=e:\bonddt.log buffer=1000000 ...
- Asp.net Mvc模块化开发之“部分版本部分模块更新(上线)”
项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统不是本文探讨的问题,但是重构后如何上线部署和本文关系密切.这个大家可 ...
- 【Java每日一题】20161031
package Oct2016; import java.util.SortedSet; import java.util.TreeSet; public class Ques1031 { publi ...
- Scalaz(25)- Monad: Monad Transformer-叠加Monad效果
中间插播了几篇scalaz数据类型,现在又要回到Monad专题.因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad.熟练掌握Monad运用.曾 ...
- 泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process
在上两篇讨论中我们介绍了IO Process:Process[I,O],它的工作原理.函数组合等.很容易想象,一个完整的IO程序是由 数据源+处理过程+数据终点: Source->Process ...
- Linux命令详解之—more命令
Linux more命令同cat命令一样,多用来查看文件内容,本文就为大家介绍下Linux more命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux的more命令类似 ca ...