SlideShare a Scribd company logo
1 of 161
Node在淘宝的应用实践
这些年,我们一起    发过的Node.js
By @朴




        1
于我




2
于我

• CNode社区



            2
于我

• CNode社区
• 前端 at SAP for Mobile Web


                 2
于我

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

                 2
于我
                             连
• CNode社区                IE6都能兼容的


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

                 2
议程




 3
议程
•   我为什么要做Node 发




               3
议程
•   我为什么要做Node 发

•   准备工作与作品




               3
议程
•   我为什么要做Node 发

•   准备工作与作品

•   Node.js带来的新问题与如何逆袭

    •     步编程

    •   缓存与内存

    •   Buffer




                  3
议程
•   我为什么要做Node 发

•   准备工作与作品

•   Node.js带来的新问题与如何逆袭

    •     步编程

    •   缓存与内存

    •   Buffer

•   Node.js在淘宝产品中的一点实践

                  3
长达半天的欢乐




   4
长达半天的欢乐




   4
长达半天的欢乐




   4
长达半天的欢乐




   4
长达半天的欢乐




   4
长达半天的欢乐




前端屌丝的坎   路
             4
长达半天的欢乐


         icons powered by morcha design




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




     5
Node与前端的亲缘




     6
Node与前端的亲缘




     6
Node与前端的亲缘




     6
左手HTML5右手Node.js




        7
左手HTML5右手Node.js
• 熟知的JavaScript执行原理/事件循环




            7
左手HTML5右手Node.js
• 熟知的JavaScript执行原理/事件循环
• 熟悉的API、事件、单线程、回调



            7
左手HTML5右手Node.js
• 熟知的JavaScript执行原理/事件循环
• 熟悉的API、事件、单线程、回调
• Ajax/ 步


            7
左手HTML5右手Node.js
• 熟知的JavaScript执行原理/事件循环
• 熟悉的API、事件、单线程、回调
• Ajax/ 步
• 相比HTML5,Node将 启更多的可能性
            7
好奇心 & 满足感




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




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




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

•   Cookie & Session




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

•   Cookie & Session

•   Request & Response




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

•   Cookie & Session

•   Request & Response

•   Web Framework




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

 •   Cookie & Session

 •   Request & Response

 •   Web Framework

• 高性能JavaScript平台

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

 •   Cookie & Session

 •   Request & Response

 •   Web Framework

• 高性能JavaScript平台
• 拓宽视野
                          8
Go, go, go!!!




       9
Go, go, go!!!




       9
Go, go, go!!!




       9
Go, go, go!!!
var http = require('http');
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
Go, go, go!!!




       9
Go, go, go!!!
% node example.js
Server running at http://127.0.0.1:1337/




                                 9
作品




 10
作品




 10
作品




 10
全JavaScript堆栈的产品




        11
全JavaScript堆栈的产品




        11
全JavaScript堆栈的产品




        11
全JavaScript堆栈的产品




        11
全JavaScript堆栈的产品
             Connect




        11
全JavaScript堆栈的产品
             Connect




        11
全JavaScript堆栈的产品
                      Connect




Redis & MRedis




                 11
全JavaScript堆栈的产品
                      Connect




Redis & MRedis




                 11
全JavaScript堆栈的产品
                             Connect




Redis & MRedis
                 MongoSkin




                        11
全JavaScript堆栈的产品
                               Connect


                             ITier


Redis & MRedis
                 MongoSkin




                        11
全JavaScript堆栈的产品
                               Connect


                             ITier


Redis & MRedis
                 MongoSkin




                        11
全JavaScript堆栈的产品
                               Connect


                             ITier


Redis & MRedis
                 MongoSkin


                              Should

                        11
全JavaScript堆栈的产品
                               Connect


                             ITier


Redis & MRedis
                 MongoSkin


                              Should

                        11
全JavaScript堆栈的产品
                               Connect


WebGhost                     ITier


Redis & MRedis
                 MongoSkin


                              Should

                        11
前端工程师到Web工程师




      12
前端工程师到Web工程师


如何摆脱前端屌丝的身份




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


如何摆脱前端屌丝的身份




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


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




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




           结果重了10斤




      12
问题:            步协作
• 嵌套还是并行?




            13
问题:                           步协作
• 嵌套还是并行?
$.get("template", function (template) {
    // something
    $.get("data", function (data) {
        // something
        $.get("l10n", function (l10n) {
            // something
            render(template, data);
        });
    });
});

                                 13
问题:            步协作
• 嵌套还是并行?




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




    14
问题: 步还是同步
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 _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
问题: 步还是同步
• 杂的 步编程




    14
问题: 步还是同步
• 杂的 步编程
var view = fs.readFileSync("../views/index.html", "utf8");




                                 14
问题: 步还是同步
• 杂的 步编程
var view = fs.readFileSync("../views/index.html", "utf8");



同步 + 缓存,妥妥滴



                                 14
问题:缓存的使用




    15
问题:缓存的使用
var map = {};
var get = function (key) {
  return map[key];
};
var set = function (key, value) {
  map[key] = value;
};
// 检查缓存
if (!get(key)) {
  // 从数据库或          的地方获取了对象后,放进缓存中
 set(key, value);

                                    15
问题:缓存的使用




    15
问题:缓存的使用
var LimitableMap = require('limitablemap');
var map = new LimitableMap(1000);
map.set("key1", "key1");
map.get("key1");




                               15
问题:Session




     16
问题:Session
• V8内存堆栈限制




             16
问题:Session
• V8内存堆栈限制
• 分布式中,Session需要共享(Redis)



             16
问题:Session
• V8内存堆栈限制
• 分布式中,Session需要共享(Redis)
• 重启应用不丢失session

             16
问题:Session
• V8内存堆栈限制
• 分布式中,Session需要共享(Redis)
• 重启应用不丢失session
• 多点Redis,备份容灾
             16
问题:Buffer对象




     17
问题:Buffer对象
var data = "";
res.on('data', function (chunk) {
 // chunk是一个Buffer对象
 data += chunk;// 隐藏的toString()
})
.on("end", function () {
  //对data转码
});




                                    17
问题:Buffer对象




     17
// 正   的方法
var chunks = [];
var size = 0;

         问题:Buffer对象
res.on('data', function (chunk) {
  chunks.push(chunk);
  size += chunk.length;
});
res.on('end', function () {
  var data = null;
  switch(chunks.length) {
    case 0: data = new Buffer(0);
     break;
    case 1: data = chunks[0];
     break;
    default:
     data = new Buffer(size);
     for (var i = 0, pos = 0, l = chunks.length; i < l; i++) {
       var chunk = chunks[i];
       chunk.copy(data, pos);
       pos += chunk.length;
     }
     break;
  }
                                            17
});
问题:Buffer对象




     17
问题:Buffer对象
// 简单且正        的方法
var bufferHelper = new BufferHelper();
req.on("data", function (chunk) {
  bufferHelper.concat(chunk);
})
.on('end', function () {
  var html = bufferHelper.toBuffer().toString();
});



                                 17
问题:String传输的性能




       18
问题:String传输的性能

• 7k大小的静态文件,需做替换



         18
问题:String传输的性能

• 7k大小的静态文件,需做替换
• String ➛ Buffer


          18
问题:String传输的性能

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

          18
问题:多核CPU的利用




     19
问题:多核CPU的利用
•   单线程与多核CPU




                19
问题:多核CPU的利用
•   单线程与多核CPU

•   单线程因为   常退出?




                19
问题:多核CPU的利用
•   单线程与多核CPU

•   单线程因为      常退出?

•   仿若熟悉的Web Worker: child_process




                    19
问题:多核CPU的利用
•   单线程与多核CPU

•   单线程因为      常退出?

•   仿若熟悉的Web Worker: child_process

•   进程与消息




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


 •
var master = new cluster.Master();
     单线程与多核CPU
master.register(8080, 'app.js');
master.dispatch();
 •   单线程因为              常退出?

 •   仿若熟悉的Web Worker: child_process

 •   进程与消息




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


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


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

worker.ready(function (socket) {
  server.emit('connection', socket);
});                               19
问题:多核CPU的利用
var cluster = require('node-cluster');


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


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

worker.ready(function (socket) {
  server.emit('connection', socket);
});                               19
小结




 20
小结
•   步编程问题?EventProxy、JScex等




              20
小结
• 步编程问题?EventProxy、JScex等
• 内存限制问题?第三方存储Redis



            20
小结
• 步编程问题?EventProxy、JScex等
• 内存限制问题?第三方存储Redis
• CPU消耗问题?缓存中间结果


            20
小结
• 步编程问题?EventProxy、JScex等
• 内存限制问题?第三方存储Redis
• CPU消耗问题?缓存中间结果
• 单线程CPU利用不足问题?多进程
            20
小结
• 步编程问题?EventProxy、JScex等
• 内存限制问题?第三方存储Redis
• CPU消耗问题?缓存中间结果
• 单线程CPU利用不足问题?多进程
• 单线程稳定性问题?Node-Cluster
            20
实践:运维




  21
实践:运维
•   常




          21
实践:运维
• 常
• 日志



         21
实践:运维
• 常      //        步方法中try catch是不靠谱滴

• 日志     //        步方法的    常
         async(function (err, data) {
          if (err) {
            logger.error(err);
            return; // TODO
          }
          // TODO




              21
实践:运维
• 常
• 日志



         21
实践:运维
• 常
• 日志
• 监控


         21
实践:运维
• 常
• 日志
         进程数量
         CPU
         内存
• 监控     Load
         磁盘IO




          21
实践:运维
• 常
• 日志
• 监控


         21
实践:运维
• 常
• 日志
• 监控
• 部署

         21
实践:运维
• 常
• 日志
• 监控
• 部署
• 备份容灾
         21
实践:运维
• 常
• 日志     双机房
         双Redis MRedis模块

• 监控     双MongoDB MongoSkin


• 部署
• 备份容灾
          21
实践:运维
• 常
• 日志
• 监控
• 部署
• 备份容灾
         21
实践:测试




  22
实践:测试
• 测试




         22
实践:测试
• 测试
•   单元测试




           22
实践:测试
• 测试
•   单元测试




           22
实践:测试
• 测试
•   单元测试



                Should.js




           22
实践:测试
• 测试
•   单元测试

•   自动化测试
                 Should.js




            22
实践:测试
• 测试
•   单元测试

•   自动化测试
                 Should.js
                             WebGhost


            22
实践:测试
• 测试
•   单元测试

•   自动化测试
                 Should.js
•   性能测试
                             WebGhost


            22
实践:测试
• 测试
•   单元测试

•   自动化测试
                 Should.js
•   性能测试
                             WebGhost


            22
实践:测试
• 测试
•   单元测试

•   自动化测试
                 Should.js
•   性能测试
                             WebGhost
• 持续集成
            22
实践:CommonJS & Node & NPM




            23
实践:CommonJS & Node & NPM

CommonJS




            23
实践:CommonJS & Node & NPM

CommonJS




            23
实践:CommonJS & Node & NPM

CommonJS




            23
实践:CommonJS & Node & NPM

CommonJS




            23
实践:CommonJS & Node & NPM

CommonJS




           Node


             23
实践:CommonJS & Node & NPM

CommonJS




           Node


             23
实践:CommonJS & Node & NPM

CommonJS           NPM




           Node


             23
实践:CommonJS & Node & NPM

CommonJS           NPM




           Node


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




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

• 如何保护隐私代码



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

• 如何保护隐私代码
• 如何重用散乱代码


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

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

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




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

           官方NPM




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

           官方NPM




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




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




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




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




        项目


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




        项目


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




私有模块     项目


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




私有模块     项目


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




私有模块     项目


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




私有模块     项目      公有模块


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




私有模块     项目      公有模块


           25
展望




 26
展望
• 深度发掘前端   发和用户体验




            26
展望
• 深度发掘前端 发和用户体验
• 无需与 发沟通,节省成本




          26
展望
• 深度发掘前端 发和用户体验
• 无需与 发沟通,节省成本
• 知晓细节,更易改进产品体验



          26
展望
• 深度发掘前端 发和用户体验
• 无需与 发沟通,节省成本
• 知晓细节,更易改进产品体验
• 感谢伟大的github


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


           27

More Related Content

What's hot

Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Chu-Siang Lai
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構Mu Chun Wang
 
Java trouble shooting
Java trouble shootingJava trouble shooting
Java trouble shootingMin Zhou
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)Chu-Siang Lai
 
Java cpu
Java cpuJava cpu
Java cpuykdsg
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介琛琳 饶
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1Yi-Feng Tzeng
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)wang hongjiang
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-ControlMu Chun Wang
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化Mu Chun Wang
 
twMVC#26 | 淺談 ASP.NET Caching 技術與實踐
twMVC#26 | 淺談 ASP.NET Caching 技術與實踐twMVC#26 | 淺談 ASP.NET Caching 技術與實踐
twMVC#26 | 淺談 ASP.NET Caching 技術與實踐twMVC
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsHo Kim
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能Mu Chun Wang
 
Java Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent QueueJava Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent QueueMin Zhou
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC
 

What's hot (20)

Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)Continuous Delivery with Ansible x GitLab CI (2e)
Continuous Delivery with Ansible x GitLab CI (2e)
 
DAE
DAEDAE
DAE
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
 
Java trouble shooting
Java trouble shootingJava trouble shooting
Java trouble shooting
 
Ali-tomcat
Ali-tomcatAli-tomcat
Ali-tomcat
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
 
Java cpu
Java cpuJava cpu
Java cpu
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介
 
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
善用 MySQL 及 PostgreSQL - RDBMS 的逆襲 - part1
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
 
twMVC#26 | 淺談 ASP.NET Caching 技術與實踐
twMVC#26 | 淺談 ASP.NET Caching 技術與實踐twMVC#26 | 淺談 ASP.NET Caching 技術與實踐
twMVC#26 | 淺談 ASP.NET Caching 技術與實踐
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
 
Java Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent QueueJava Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent Queue
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIStwMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
twMVC#32應用 ASP.NET WebAPI2 Odata 建置高互動性 APIS
 

Similar to D2_Node在淘宝的应用实践

Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用Jerry Lin
 
如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進Mu Chun Wang
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
Yog Framework
Yog FrameworkYog Framework
Yog Frameworkfansekey
 
.Net网络编程入门
.Net网络编程入门.Net网络编程入门
.Net网络编程入门magicshui
 
Node js实践
Node js实践Node js实践
Node js实践myzykj
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰Scourgen Hong
 
使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocity使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocitykumawu
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集zhen chen
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails serverMichael Chen
 
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 進攻桌面開發Fred Chien
 

Similar to D2_Node在淘宝的应用实践 (20)

Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用
 
如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進
 
Html5
Html5Html5
Html5
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
Yog Framework
Yog FrameworkYog Framework
Yog Framework
 
.Net网络编程入门
.Net网络编程入门.Net网络编程入门
.Net网络编程入门
 
Node js实践
Node js实践Node js实践
Node js实践
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
 
使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocity使用Big pipe提升浏览速度 wk_velocity
使用Big pipe提升浏览速度 wk_velocity
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails server
 
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 進攻桌面開發
 

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
 
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 (9)

(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
 
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在淘宝的应用实践

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n