Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

Node.js

在花瓣网的应用

belltoy
2012.12.22

花瓣网介绍

兴趣图谱
2011.11.11正式上线
百万用户,千万PV

Let's build it

选择语言

首先,要满足快速开发的需求
  • 团队熟练程度
  • 敏捷性
  • 库支持

Node.JS of course

Why not PHP?

  • 不喜欢这个语言
  • 需要调用大量外部服务
  • 不适合写长时间运行的任务
  • Why Node.JS?

    Web 框架

    Express

    大量中间件

    模板引擎

    Jade

    同时支持

    浏览器端渲染
    服务器端渲染

    For what purpose ?

    Jade 模板引擎使用 with 语句

    // with 语句
    var user = { name: 'foo' };
    with (user) {
        var name = 'bar';
    }
    console.log(user.name);
    // output is 'bar'
            

    with 语句的问题

    解决办法

    不使用 with 语句

    Jade each 语句

    生成的代码太长

    解决办法

    去掉用不到的

    花瓣
    App Server

    实现

    = Modules + Services

    Faster than C ?

    A story

    关于

    MySQL 客户端

    mysql
    2.0.0-alpha4

    性能很好
    小心有

    // node_modules/mysql/lib/protocol/packets/RowDataPacket.js
    var numberString = parser.parseLengthCodedString();
    return (numberString === null
        || (field.zeroFill && numberString[0] == "0"))
        ? numberString
        : Number(numberString);
                
            

    Thank you!

    npm

    图片存储服务

    又拍云存储

    回调多了
    难免有

    callback function

    // e.g. 
    User.load(user_id, function(err, user){
        Profile.load(user_id, function(err, profile){
            Pin.loadUserPins(user_id, opts, function(err, pins){
                Board.load(pin.board_id, function(err, board){
                    // 爹啊,后面都看不见了
                });
            });
        });
    });
                
            

    Seq

    var Seq = require('seq');
    Seq()
        .seq(function(){
            // do something
            Pin.loadUserPins(user_id, opts, this);
        })
        .flatten()
        .parEach(5, function(pin){
            // do something in parallel
        })
        .seq(function(){
            // do something
        })
        .catch(function(err){
            // catch exception
        });
            
            

    又跳进一个

    大量消耗 CPU

    async

    CPU 降了,但是 . . .

    var async = require('async');
    async.waterfall([
        function(next){
            // e.g. load user
        },
        function(user, next){
            // load something
        }
    ], function(err, result){
        if (err) callback(err);
        // return something
    });
            

    还 有

    // async.js
    var args = Array.prototype.slice.call(arguments, 1);
    var next = iterator.next();
    if (next) {
        args.push(wrapIterator(next));
    }
    else {
        args.push(callback);
    }
    async.nextTick(function () {
        iterator.apply(null, args);
    });
            
    var async = require('async');
    async.waterfall([
        function(next){
            // e.g. load user
        },
        function(user, next){
            // 小心!别踩到里了
            // user may become next callback
            // next may be undefined
        }
    ], function(err, result){
        // return something
    });
            

    强制规范你的代码

    function doSomething(arg, callback) {
        // do something
        if (err) return callback(err);
        if (some_test) {
            callback(null, null);
        } else {
            callback(null, result);
        }
    }
            

    测试框架

    耗时操作

    必须从请求中脱离出来

    要有任务系统

    什么样的任务系统

    它需要满足:

  • 基于事件/消息
  • 工作进程管理
  • 容错性
  • 消息可持久化
  • Cast / Call
  • 分布式的
    • Erlang/OTP
    • Riak Core
    • Node.JS worker
    • leveldb

    More things TODO:

    JavaScript 强大,但是也有糟粕

    Node.JS 好玩,偶尔也挺

    Join us! 让我们一起来踩吧!

    hr@huaban.com

    谢谢观看

    Powered by
    impress.js

    Use a spacebar or arrow keys to navigate