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为载体语言

  1. javascript语法简单,基本上web程序员都会,利于项目的推广
  2. javascript语法特性之一 闭包(cloure),大大简化了异步编程难度
  3. Chrome v8 性能出色,代码结构清晰,二次开发简单

上面三点是Nodejs这个项目能够如此成功的客观原因,但是选择什么语法很多时候是作者的个人意愿:万事架不住爷乐意

nodejs两大特点

  1. 利用libevent果断支持高并发
  2. event driven的异步IO模型(不只限于网络io,包括文件读写,数据库访问 都是异步

Nodejs 类库有什么特点

nodejs有很多库函数,印象最深的是

  1. crypto
  2. buffer

crypto 可以使用的场景很少,nodejs在创建之初就比较完备的支持,很罕见

buffer 是写socket server程序必不可少的部件

Nodejs在实际开发中的缺点

我们在某个项目中使用Nodejs开发了一个server程序,运行了1个多月之后就换成了其他方案,缺点有3

  1. nodejs是所谓多路复用的IO模型,程序跑在单实例下(cluster版本很不稳定),没有可靠的watch dog程序,稳定性不高
  2. javascript语法简单到贫乏的地步,不适合用来开发逻辑复杂的代码,总体开发效率不高
  3. nodejs项目不够成熟,运行异常/错误信息的相关度不高,debug很困难,错误提示全靠猜

这几个问题随着Nodejs项目的日渐成熟应该能够得到解决

为什么说Nodejs不适合做web 编程

nodejs有两大特性,这个两个特性 针对 web 编程都不是优势

  1. 高并发对web framework来说意义不大,可以参考 http://lutaf.com/141.htm
  2. 异步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');
    

    编程简单,部署到线上很好的性能,值得尝试

本文地址: http://lutaf.com/161.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接