2012年在公司做了一次Nodejs( http://nodejs.org/)的讲演,演讲PPT中要点如下
Nodejs:一种高并发务器端编程工具
Nodejs是什么
- 服务器端运行的 Javascript
- 基于 Google Chrome的javascript engine V8
- Evented,no-blocking
- 扩展js语义:增加了模块化
- 大约有8000行 c/c++代码,2000行 js 代码
Nodejs为什么选择javascript为载体语言
- javascript语法简单,基本上web程序员都会,利于项目的推广
- javascript语法特性之一 闭包(),大大简化了异步编程难度
- Chrome v8 性能出色,代码结构清晰,二次开发简单
以上3个原因是Nodejs这个项目能够如此成功的客观原因,但是选择什么语法很多时候是作者的个人意愿:我喜欢就行
nodejs两大特点
- 利用libevent果断支持高并发
- event driven的异步IO模型(不只限于网络io,包括文件读写,数据库访问 都是异步
Nodejs 类库有什么特点
nodejs有很多库函数,印象最深的是
crypto可以使用的场景很少,nodejs在创建之初就比较完备的支持,很罕见
buffer是写socket server程序必不可少的部件
Nodejs在实际开发中的缺点
我们在某个项目中使用Nodejs开发了一个server程序,运行了1个多月之后就换成了其他方案,缺点有3
- nodejs是所谓多路复用的IO模型,程序跑在单实例下(cluster版本很不稳定),没有可靠的watch dog程序,稳定性不高
- javascript语法简单到贫乏的地步,不适合用来开发逻辑复杂的代码,总体开发效率不高
- nodejs项目不够成熟,运行异常/错误信息的相关度不高,debug效率不高
这几个问题随着Nodejs项目的日渐成熟应该能够得到解决
为什么说Nodejs不适合做web 编程
nodejs有两大特型,这个两个特性 针对 web 编程都不是优势
- 高并发对web framework来说意义不大,可以参考 http://lutaf.com/141.htm
异步IO更是没有用,异步IO是用增加逻辑复杂度为代价来优化性能,对普通http请求,直来直去更好
大家可能想到这样一种应用场景:某个网页的功能是去Get远程资源,这种情况下用异步IO岂不是很好? 实际情况是:这种应用场景一般都是用消息队列来实现可控异步。在web request handler里面直接做远程请求,很容易block整个应用服务器
Nodejs最佳实践
- 代码逻辑简单的Gateway Server
- WebSocket server端支持,有一个很不错开源项目可以直接用: socket.io
快速开发早期生产线上 tcp server
Nodejs极大的简化了tcp server 编程,比python twitsted,java的mina 都要简单很多,下面就是一个最简单的tcp server程序
var net = require('net'); var server = net.createServer(function (socket) { socket.write('Echo server\r\n'); socket.pipe(socket); }); server.listen(1337, '127.0.0.1');
编程简单,部署到线上很好的性能,值得尝试