SlideShare a Scribd company logo
1 of 27
Download to read offline
Node在淘宝的应用实践
这些年,我们⼀一起开发过的Node.js
By @朴灵




    1
关于我
                             连IE6都能兼
• CNode社区                     容的男人

• 前端 at SAP for Mobile Web
• 前端 at 淘宝数据产品部

                 2
议程
• 我为什么要做Node开发
• 准备工作与作品
• Node.js带来的新问题与如何逆袭
 •   异步编程

 •   缓存与内存

 •   Buffer

• Node.js在淘宝产品中的⼀一点实践
               3
长达半天的欢乐


       icons powered by morcha design




前端屌丝的坎坷路
           4
Node与前端的亲缘




     5
Node与前端的亲缘




     6
左手HTML5右手Node.js
• 熟知的JavaScript执行原理/事件循环
• 熟悉的API、事件、单线程、回调
• Ajax/异步
• 相比HTML5,Node将开启更多的可能性

            7
好奇心 & 满足感
• HTTP协议栈:深入后端,反哺前端
 •   Status code

 •   Cookie & Session

 •   Request & Response

 •   Web Framework

• 高性能JavaScript平台
• 拓宽视野
                          8
Go, go, go!!!
var http example.js
% node = require('http');
Server running at http://127.0.0.1:1337/
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');




                                  9
作品




 10
全JavaScript堆栈的产品
                               Connect


WebGhost                     ITier


Redis & MRedis
                 MongoSkin


                              Should

                        11
前端工程师到Web工程师
           让女神青睐


如何摆脱前端屌丝的身份
           结果重了10斤




      12
问题:异步协作
var proxy = new EventProxy();

•
proxy.all("template", "data", "l10n", render);
    嵌套还是并行?
$.get("template", function (template) {
    // something
$.get("template", function (template) {
    proxy.trigger("template", template);
}); // something
$.get("data", function (data) { {
    $.get("data", function (data)
        // something
    // something
        $.get("l10n", function (l10n) {
    proxy.trigger("data", data);
});         // something
            render(template, data);
$.get("l10n", function (l10n) {
        });
    // something
    });
    proxy.trigger("l10n", l10n);
});
});
                                  13
问题:异步还是同步
var proxy = new EventProxy();
var status = "ready";



• 复杂的异步编程
var _getFile = function (callback) {
  proxy.once("template", callback);
  if (status === "ready") {
    fs.readFile("views/index.html", function (err, file) {
      status = "pending";
      proxy.fire("template", err, file);
    });
  }
};
var view = fs.readFileSync("../views/index.html", "utf8");
var _template;
var getTemplate = function (callback) {
  if (_template) {
    callback(null, _template);
  } else {

 同步 + 缓存,妥妥滴
    _getFile(function (err, file) {
      if (!err && !_template) {
        _template = file.toString();
      }
      callback(null, _template);
    });
  }
};

                                               14
问题:缓存的使用
var map = {};
var get = function (key) {
var LimitableMap = require('limitablemap');
  return map[key];
}; map = new LimitableMap(1000);
var
map.set("key1", "key1");
var set = function (key, value) {
map.get("key1");
  map[key] = value;
};
// 检查缓存
if (!get(key)) {
  // 从数据库或别的地方获取了对象后,放进缓存中
  set(key, value);
}

                         15
问题:Session
• V8内存堆栈限制
• 分布式中,Session需要共享(Redis)
• 重启应用不丢失session
• 多点Redis,备份容灾
             16
// 正确的方法
var chunks = [];
var size = 0;

         问题:Buffer对象
res.on('data', function (chunk) {
  chunks.push(chunk);
  size += chunk.length;
});
var data = "";
res.on('end', function () {
res.on('data', function (chunk) {
  var data = null;
//switch(chunks.length) {
   // chunk是⼀一个Buffer对象
    简单且正确的方法
   data 0: data = new =隐藏的toString()
    case += chunk;//Buffer(0);
var break;
       bufferHelper new BufferHelper();
}) case 1: data = function
req.on("data",chunks[0]; (chunk) {
.on("end", function () {
   bufferHelper.concat(chunk);
      break;
})//对data转码
    default:
.on('end',new Buffer(size);
}); data = function () {
      for (var i = 0, pos = 0, l = chunks.length; i < l; i++) {
   varvar chunk bufferHelper.toBuffer().toString();
         html = = chunks[i];
}); chunk.copy(data, pos);
        pos += chunk.length;
      }
      break;
  }
});                                          17
问题:String传输的性能

• 7k大小的静态文件,需做替换
• String ➛ Buffer
• 缓存Buffer,4倍性能提升

          18
问题:多核CPU的利用
var cluster = require('node-cluster');


• 单线程与多核CPU
var master = new cluster.Master();
master.register(8080, 'app.js');
master.dispatch();        负载均衡
• 单线程因为异常退出?              多核利用
var http = require('http');
•                         提升稳定
  仿若熟悉的Web Worker: child_process
var cluster = require('node-cluster');

• 进程与消息
var worker = new cluster.Worker();
var server = http.createServer(function (req, res) {
  // server
});

worker.ready(function (socket) {
  server.emit('connection', socket);
});                               19
小结
• 异步编程问题?EventProxy、JScex
 等
• 内存限制问题?第三方存储Redis
• CPU消耗问题?缓存中间结果
• 单线程CPU利用不足问题?多进程
• 单线程稳定性问题?Node-Cluster
             20
实践:运维
• 异常     // 异步方法中try catch是不靠谱滴
         双机房
         // 异步方法的异常
         进程数量
• 日志     双Redis MRedis模块
         async(function (err, data) {
         CPU
         双MongoDB MongoSkin
         内存 {
           if (err)

• 监控
         数据源集群
         Loadlogger.error(err);
         磁盘IO // TODO
             return;

• 部署     流量}
           // TODO
         });
• 备份容灾
          21
实践:测试
• 测试
    •   单元测试

    •   自动化测试

    •   性能测试         Should.js

•   持续集成                         WebGhost


                22
实践:CommonJS & Node & NPM

CommonJS           NPM




           Node


             23
实践:公司范围内共享代码


• 如何保护隐私代码
• 如何重用散乱代码
• 如何告别复制粘贴

         24
实践:公司范围内共享代码
         单向同步
 本地NPM          官方NPM




私有模块     项目      公有模块


           25
展望
• 深度发掘前端开发和用户体验
• 无需与开发沟通,节省成本
• 知晓细节,更易改进产品体验
• 感谢伟大的github
• 感谢伟大的NPM促成的生态圈
• 感谢Node这件美妙的礼物
         26
Q&A

屌丝のぎゃくしゅう


            27

More Related Content

What's hot

Golang advance
Golang advanceGolang advance
Golang advancerfyiamcool
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops琛琳 饶
 
SSDB 入门基础
SSDB 入门基础SSDB 入门基础
SSDB 入门基础ideawu
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战rfyiamcool
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战dennis zhuang
 
Couchdb Beijing Openparty
Couchdb Beijing OpenpartyCouchdb Beijing Openparty
Couchdb Beijing Openpartylitaocheng
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門Will Huang
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹國昭 張
 
SSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs RedisSSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs Redisideawu
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介琛琳 饶
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局Alex Lau
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流Edward Lee
 
Http cache 的優化
Http cache 的優化Http cache 的優化
Http cache 的優化振揚 陳
 
Ceph Day Beijing - Leverage Ceph for SDS in China Mobile
Ceph Day Beijing - Leverage Ceph for SDS in China MobileCeph Day Beijing - Leverage Ceph for SDS in China Mobile
Ceph Day Beijing - Leverage Ceph for SDS in China MobileDanielle Womboldt
 
淘宝主备数据库自动切换
淘宝主备数据库自动切换淘宝主备数据库自动切换
淘宝主备数据库自动切换mysqlops
 
一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生dennis zhuang
 
Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Jinrong Ye
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Yang Guanjun
 
百姓网如何优化网速-Qcon2011
百姓网如何优化网速-Qcon2011百姓网如何优化网速-Qcon2011
百姓网如何优化网速-Qcon2011Yiwei Ma
 

What's hot (20)

Golang advance
Golang advanceGolang advance
Golang advance
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
 
SSDB 入门基础
SSDB 入门基础SSDB 入门基础
SSDB 入门基础
 
Golang 高性能实战
Golang 高性能实战Golang 高性能实战
Golang 高性能实战
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战
 
Couchdb Beijing Openparty
Couchdb Beijing OpenpartyCouchdb Beijing Openparty
Couchdb Beijing Openparty
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
 
SSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs RedisSSDB(LevelDB server) vs Redis
SSDB(LevelDB server) vs Redis
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流
 
Http cache 的優化
Http cache 的優化Http cache 的優化
Http cache 的優化
 
Ceph Day Beijing - Leverage Ceph for SDS in China Mobile
Ceph Day Beijing - Leverage Ceph for SDS in China MobileCeph Day Beijing - Leverage Ceph for SDS in China Mobile
Ceph Day Beijing - Leverage Ceph for SDS in China Mobile
 
淘宝主备数据库自动切换
淘宝主备数据库自动切换淘宝主备数据库自动切换
淘宝主备数据库自动切换
 
一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生
 
Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析
 
百姓网如何优化网速-Qcon2011
百姓网如何优化网速-Qcon2011百姓网如何优化网速-Qcon2011
百姓网如何优化网速-Qcon2011
 

Similar to D2_node在淘宝的应用实践_pdf版

Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 Renaun Erickson
 
Yog Framework
Yog FrameworkYog Framework
Yog Frameworkfansekey
 
Chasingice
ChasingiceChasingice
Chasingice冰 白
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践longhao
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsHo Kim
 
Browser vs. Node.js Jackson Tian Shanghai
Browser vs. Node.js   Jackson Tian ShanghaiBrowser vs. Node.js   Jackson Tian Shanghai
Browser vs. Node.js Jackson Tian ShanghaiJackson Tian
 
Node js实践
Node js实践Node js实践
Node js实践myzykj
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用Jerry Lin
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big DataKuo-Chun Su
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计fuchaoqun
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)Marc Huang
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具國昭 張
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 

Similar to D2_node在淘宝的应用实践_pdf版 (20)

Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
 
Yog Framework
Yog FrameworkYog Framework
Yog Framework
 
Chasingice
ChasingiceChasingice
Chasingice
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
 
Tcfsh bootcamp day2
 Tcfsh bootcamp day2 Tcfsh bootcamp day2
Tcfsh bootcamp day2
 
Browser vs. Node.js Jackson Tian Shanghai
Browser vs. Node.js   Jackson Tian ShanghaiBrowser vs. Node.js   Jackson Tian Shanghai
Browser vs. Node.js Jackson Tian Shanghai
 
Node js实践
Node js实践Node js实践
Node js实践
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用
 
Node分享 展烨
Node分享 展烨Node分享 展烨
Node分享 展烨
 
Berserk js
Berserk jsBerserk js
Berserk js
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big Data
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 

More from Jackson Tian

Mobile webapp&v5 html5_min
Mobile webapp&v5 html5_minMobile webapp&v5 html5_min
Mobile webapp&v5 html5_minJackson Tian
 
Nodejs异步原理和缺陷 - 赵成
Nodejs异步原理和缺陷 - 赵成Nodejs异步原理和缺陷 - 赵成
Nodejs异步原理和缺陷 - 赵成Jackson Tian
 
EventProxy introduction - JacksonTian
EventProxy introduction - JacksonTianEventProxy introduction - JacksonTian
EventProxy introduction - JacksonTianJackson Tian
 
Mongoskin - Guilin
Mongoskin - GuilinMongoskin - Guilin
Mongoskin - GuilinJackson Tian
 
MobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designMobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designJackson Tian
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiJackson Tian
 
NodeJS快速服务端开发 朝沐金风 Shanghai
NodeJS快速服务端开发 朝沐金风 ShanghaiNodeJS快速服务端开发 朝沐金风 Shanghai
NodeJS快速服务端开发 朝沐金风 ShanghaiJackson Tian
 
Ruby vs Node ShiningRay Shanghai
Ruby vs Node ShiningRay ShanghaiRuby vs Node ShiningRay Shanghai
Ruby vs Node ShiningRay ShanghaiJackson Tian
 

More from Jackson Tian (10)

(C)NodeJS
(C)NodeJS(C)NodeJS
(C)NodeJS
 
Mobile webapp&v5 html5_min
Mobile webapp&v5 html5_minMobile webapp&v5 html5_min
Mobile webapp&v5 html5_min
 
Nodejs异步原理和缺陷 - 赵成
Nodejs异步原理和缺陷 - 赵成Nodejs异步原理和缺陷 - 赵成
Nodejs异步原理和缺陷 - 赵成
 
EventProxy introduction - JacksonTian
EventProxy introduction - JacksonTianEventProxy introduction - JacksonTian
EventProxy introduction - JacksonTian
 
Mongoskin - Guilin
Mongoskin - GuilinMongoskin - Guilin
Mongoskin - Guilin
 
MobileWebAppFramework_V5_design
MobileWebAppFramework_V5_designMobileWebAppFramework_V5_design
MobileWebAppFramework_V5_design
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin Shanghai
 
NodeJS快速服务端开发 朝沐金风 Shanghai
NodeJS快速服务端开发 朝沐金风 ShanghaiNodeJS快速服务端开发 朝沐金风 Shanghai
NodeJS快速服务端开发 朝沐金风 Shanghai
 
Ruby vs Node ShiningRay Shanghai
Ruby vs Node ShiningRay ShanghaiRuby vs Node ShiningRay Shanghai
Ruby vs Node ShiningRay Shanghai
 

D2_node在淘宝的应用实践_pdf版