关于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模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
随机推荐
- Model元数据定制与Model模板
元数据这一词对于计算机科学来说不算陌生,对元数据的解释最简单的解释就是描述数据的数据,那么Model元数据当然是描述Model中各种成员的数据了,在ASP.NET MVC中ModelMetadata这 ...
- SignalR入门之多平台SignalR服务端
之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...
- Linux移植的一般过程
前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程. 一开始的UBOOT的移植不多说了.UBOOT最后有两种方式进入Linux,一种是使用uImage, ...
- How do I set the default schema for a user in MySQL
http://stackoverflow.com/questions/12426320/how-do-i-set-the-default-schema-for-a-user-in-mysql up ...
- 代码与图详解性能之Python集合类型(list tuple dict set generator)
Python内嵌的集合类型有list.tuple.set.dict. 列表list:看似数组,但比数组强大,支持索引.切片.查找.增加等功能. 元组tuple:功能跟list差不多,但一旦生成,长度及 ...
- HDU 5510---Bazinga(指针模拟)
题目链接 http://acm.hdu.edu.cn/search.php?action=listproblem Problem Description Ladies and gentlemen, p ...
- 为vs2012添加背景和皮肤
每天对着电脑用VS进行编码开发,难免有点单调.我们可以试着像设置电脑桌面壁纸一样设置VS皮肤. 先看下效果 1.打开vs2012,工具——扩展和更新 2.选择联机,搜索并分别安装如下两个插件 3.安装 ...
- 18 个命令&工具帮你定位 Linux 性能问题
1.TopTop命令是一个性能监控程序,它按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果.这条命令显示了CPU的使用率.内存使用率.交换内存使用大小.高速缓存使用大小. ...
- 高效 Java Web 开发框架 JessMA v3.2.3 正式发布
JessMA(原名:Portal-Basic)是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hib ...
- gcc shared object
介绍一个生成动态链接库*.so的例子: 首先新建1个头文件test.h: #include <stdio.h> void first(); void second(); void thir ...