关于NodeJS的思考

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

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

Ryan Dahl所设计的NodeJS是一个单线程异步IO模型执行机制的服务端程序。IO操作将会交给专用的工作线程处理,回调的方法将插入主线程队列,因为NodeJS是单线程模型,面向CPU操作的业务都会排队在主线程中执行。这也恰恰是NodeJS的弱点,如果CPU操作的业务时间太长,将会影响其他业务,不过还好目前已经有解决方法了。NodeJS不知道为什么无法使用TryCatch捕获异常,这问题将导致程序调试时的复杂性,同时会引发整个崩溃重启,不过目前第三方已经实现捕捉异常,但还是无法避免崩溃重启。Ryan Dahl在设计NodeJS引入NPM方便社区协作,使得NodeJS的功能的迭代速度进一步加快。同时NodeJS自身集成了Server方便敏捷开发和部署。NodeJS还可以做其他软件,不仅局限于Web端。

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

时间: 2024-08-01 08:24:06

关于NodeJS的思考的相关文章

NodeJS&&前端思考

做大型软件(工程化): 1.测试相关 tdd / bdd 测试覆盖率 2.规范化 standard.各种 lint.hint 3.构建相关 gulp.grunt.webpack,大量插件 4.生成器 yo 等 工程脚手架,生成项目基本框架 5.包管理工具 npm 足够简单易用 MEAN架构: MEAN 是目前最潮的全栈 JavaScript 架构.MEAN 是一个 JavaScript 平台的现代 Web 开发框架总称,它是 MongoDB Express AngularJS Node.js 四

Nodejs部署再思考

pm2 好处就不说了 今天遇到一个奇怪的问题,部署一台新的机器,无论怎么弄,什么版本都会报错 js-bson: Failed to load c++ bson extension, using pure JS version 我曾经无数次的怀疑,是mongodb的问题,于是我手动编译了bson和bson-ext,以及相关的 connect-mongo mongoose 可是还不好使..... 我觉得很奇怪,没有理由啊,我去查pm2的源码和文档,发现cluster mode必须是0.12之后才有,

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

---恢复内容开始--- 新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我和写后台接口的哥哥的一段对话: 后台:过两天的后台管理你写的话,用express写还是不用? 我  :看了两天后台源码,我觉得用express更省力一些,因为要牵涉到一些界面操作,用express创建项目应用模板和其他一些工具更方便,但是从工作分配上来说的话,用自己写的server代码结构更清晰,前

angularjs 结合 nodejs 开发前后端的一些探索和思考

angularjs是近年很火的一个前端MV*架构,拥有良好的社区,文档支持,在设计上使用沙箱模式,并且实现了注入依赖,提供了非常好的代码测试.今年在github上关于angularjs的插件也是层出不穷.本人也将angularjs使用在若干个实际的项目上,个人感觉,如果有使用jquery及相关插件经历的同学,可能会在使用上有一些不适应,但是整体说了,入门还是不是特别的难,不过当遇到问题的时候,建议在angularjs的社区或者stackfollow中找找,或者是看看angularjs的源码. n

关于nodejs访问mysql的思考

nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql.安装成功后的访问数据库代码如下: var mysql = require('mysql'); var options = { host: '172.23.88.107', port: 3306, database: 'test', user: 'root', password: 'zdsoft' }; var pool = mysql.createPool(options); pool.ge

关于后台系统自动生成的一点思考

大量实践发现后台管理程序,其实90%的代码都是相同的,当然是在抛弃复杂逻辑业务的情况下,那么如何能高效的节约这些时间呢,那就是接下来我要说的,对于后台系统自动生成的一些思考. 适用情景: 1.表编号id为自增(基于现在大部分表编号都是自增的情况): 2.没有太复杂业务关联关系,比如表的某一个字段,存储了一个json对象,为了平衡后台用户使用,需要友好的分段展示给用户的定制ui界面:还比如表中存储了外键的多个id,但为了方便用户使用,只能已标签name的方式,给用户展示,等等这些超强业务黏合逻辑的

NodeJs并发异步的回调处理

这里说并发异步,并不准确,应该说连续异步.NodeJs单线程异步的特性,直接导致多个异步同时进行时,无法确定最后的执行结果来回调.举个简单的例子: for(var i = 0; i < 5; i++) { fs.readFile('file', 'utf-8', function(error, data){}); } 连续发起了5次读文件的异步操作,很简单,那么问题来了,我怎么确定所有异步都执行完了呢?因为要在它们都执行完后,才能进行之后的操作.相信有点经验的同学都会想到使用记数的方式来进行,但

【nodejs学习】0.nodejs学习第一天

1.模块 大一点的程序都需要模块化,nodejs也不例外,代码放到不同的文件中,每一个文件就可以是一个模块,文件路径名就是一个模块名.每个模块中包含三个预先定义的变量: 1.require:用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象,".js"可以省略. eg:var fool1 = require('./foo');//.foo.js,/home/user/foo var data = require('./data.json');//加载json文件

关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)

反向代理也是一种可以帮助实现网站静态化的重要技术,今天我就来讲讲反向代理这个主题.那么首先我们要了解下什么是反向代理.和反向代理相对应的是正向代理,正向代理也就是我们常说的代理服务,正向代理是非常常见的,例如在某些公司里我们想使用互联网,那么我们就得在浏览器里设置一个代理服务器,通过代理服务器我们才能正常使用互联网,而这个代理服务器就是一个正向代理服务器.正向代理更加让人熟悉的使用场景估计还是在FQ技术里的使用,我们使用一个放置在国外的代理服务器来访问那些在国内无法正常访问的网站,这其实也是在使