@floatdrop
bit.ly/nodejs-­‐‑shri
Node.JS
History
bit.ly/crcfd
 

1987
1
2 on mouseUp
3
get the selection
4
if it is empty then as "Dial what number?"
5
if it is not empty then
6
push this card...
1995
Расчитан  на  обработку  событий

1995
Расчитан  на  обработку  событий
Был  написан  за  

1995

  дней
Расчитан  на  обработку  событий
Был  написан  за  

10  дней

1995
Расчитан  на  обработку  событий

10

Был  написан  за  
  дней
Function  as  first-­‐‑class  objects

1995
Расчитан  на  обработку  событий

10

Был  написан  за  
  дней
Function  as  first-­‐‑class  objects
Прототипное  наследо...
2005
2005
AJAX
2005
2009
Node.JS
JavaScript  on  server

2009
Apache  +  PHP  =  ❤
Apache  +  PHP  =  ❤
index.php
1
2
3
4
5
6
7
8
9

$result = mysqli_query( $con,
"SELECT * FROM Persons");
while($row = mysqli_fetch_array($resu...
Single-­‐‑thread  server

Pictures  from  node-­‐‑explained
Single-­‐‑thread  server

Pictures  from  node-­‐‑explained
Single-­‐‑thread  server

Pictures  from  node-­‐‑explained
Single-­‐‑thread  server

Pictures  from  node-­‐‑explained
Single-­‐‑thread  server

Pictures  from  node-­‐‑explained
Multi-­‐‑thread  server
 

  
Ryan  Dahl
  

  
Ryan  Dahl
  

I/O  has  to  be  done  differently.
We  are  doing  it  wrong
  
Ryan  Dahl
  

I/O  has  to  be  done  differently.
We  are  doing  it  wrong
  

bit.ly/jsconf-­‐‑node
event-­‐‑loop  сервер
event-­‐‑loop  сервер
event-­‐‑loop  сервер
event-­‐‑loop  сервер
event-­‐‑loop  сервер
event-­‐‑loop  сервер
event-­‐‑loop  сервер
event-­‐‑loop  server
bit.ly/bombanulo
event-­‐‑loop  server
goes  wrong
JavaScript  is  slow

bit.ly/bombanulo-­‐‑2
"ʺSimple"ʺ  benchmark

bit.ly/dumb-­‐‑test
Installing

nodejs.org/download
Running
Running
Running
Running
windows
window
document
document
global
global
global
process
process
process
Modules
require('ʹantigravity'ʹ)
module.js
1
2
3
4
5

function HelloWorld () {
console.log('Hello world');
}
console.log('Module loaded');
index.js
1

require('./module');
index.js
1
2
3

require('./module');
HelloWorld();
module.js
1
2
3
4
5
6
7

function HelloWorld () {
console.log('Hello world');
}
console.log('Module loaded');
exports.Hell...
index.js
1
2
3

var module = require('./module');
module.HelloWorld();
module.js
1
2
3
4
5
6
7

function HelloWorld () {
console.log('Hello world');
}
console.log('Module loaded');
global.Hello...
index.js
1
2
3

require('./module');
HelloWorld();
exports  vs  module.exports
exports  vs  module.exports
russian.js
1
2
3
4
5
6

var en_translation = {
yes: 'Нет',
no: 'Да'
};
exports = en_translatio...
exports  vs  module.exports
russian.js
1
2
3
4
5
6

var en_translation = {
yes: 'Да',
no: 'Нет'
};
module.exports = en_tra...
exports  vs  module.exports
russian.json
{
"yes": "да",
"no": "нет"
}
requrie('ʹ./directory'ʹ)
requrie('ʹ./directory'ʹ)
3.   require('ʹ./directory/index.json'ʹ)
requrie('ʹ./directory'ʹ)
3.   require('ʹ./directory/index.json'ʹ)
2.   require('ʹ./directory/index.js'ʹ)
requrie('ʹ./directory'ʹ)
3.   require('ʹ./directory/index.json'ʹ)
2.   require('ʹ./directory/index.js'ʹ)
1.   require('ʹ./...
require('http')
require('express')
require('./index.js')
require('./config.json')
require('./module') // Directory
Simple  web-­‐‑server
Simple  web-­‐‑server
Simple  web-­‐‑server
Simple  web-­‐‑server
Simple  web-­‐‑server
Simple  web-­‐‑server
index.js
1
2
3
4
5
6
7
8
9

var http = require('http');
function helloService(request, response) {
r...
Run,  Forest,  Run!
Run,  Forest,  Run!
Run,  Forest,  Run!
Run,  Forest,  Run!
Simple  web-­‐‑server
node_modules
Run,  Forest,  Run!
Run,  Forest,  Run!
Run,  Forest,  Run!
Run,  Forest,  Run!
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
1.   /home/user/programm/library/node_modules/antigravit...
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
1.   /home/user/programm/library/node_modules/antigravit...
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
1.   /home/user/programm/library/node_modules/antigravit...
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
1.   /home/user/programm/library/node_modules/antigravit...
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
1.   /home/user/programm/library/node_modules/antigravit...
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
1.   /home/user/programm/library/node_modules/antigravit...
require("ʺantigravity"ʺ)
in  /home/user/programm/library/index.js
1.   /home/user/programm/library/node_modules/antigravit...
node_modules/antigravity.js
1

module.exports = new Date();

index.js
1

console.log(require("antigravity"));
node_modules/antigravity.js
1
2
3

console.log(module);
module.exports = new Date();
Circular  dependencies
Circular  dependencies
a.js
1
2

var b = require('./b.js');
console.log("B: ", b);

b.js
1
2

var a = require('./a.js');
c...
Circular  dependencies
a.js
1
2
3
4

module.exports.hello = "Hello from A";
var b = require('./b.js');
module.exports.hell...
modulecounts.com
Installing  module
Installing  module
Installing  module
Installing  module
Installing  module
Nested  dependencies
pros  /  cons
Nested  dependencies
pros  /  cons
+  Version  independent
Nested  dependencies
pros  /  cons
+  Version  independent
-­‐‑  Wieght  more
package.json
{

}

"name": "express",
"version": "3.4.4",
"dependencies": {
"connect": "2.11.0", "commander": "1.3.2", "ra...
Express  application
var express = require('express');
var app = express();
app.get('/', function(req, res) { res.end('Hel...
Event  loop
bit.ly/kantor-­‐‑node
joyent/node  -­‐‑  node.cc
joyent/node  -­‐‑  env-­‐‑inl.h
joyent/node  -­‐‑  env-­‐‑inl.h
joyent/libuv  -­‐‑  loop.c
joyent/libuv  -­‐‑  loop.c
1 static int uv__loop_init(uv_loop_t* loop, int default_loop) {
2
// ...
3
RB_INIT(&loop->timer...
uv__platform_loop_init
kqueue
epoll
joyent/node  -­‐‑  node.cc
joyent/node  -­‐‑  core.c  

:  258

1 int uv_run(uv_loop_t* loop, uv_run_mode mode) {
2
r = uv__loop_alive(loop);
3
while...
Fibonacci
1
2
3
4
5
6
7
8
9
10

function fibonacci(n) {
if (n < 2)
return 1;
else
return fibonacci(n-2) + fibonacci(n-1);
...
Fibonacci
Requests per second: 0.61
Time per request: 1634.748 ms (vs 5676 ms)
setTimeout,  setImmediate,
process.nextTick
1.   process.nextTick
1.   process.nextTick*
2.   Input  /  Output
1.   process.nextTick*
2.   Input  /  Output
3.   setImmediate
1.   process.nextTick*
2.   Input  /  Output
3.   setImmediate
4.   setTimeout
Fibonacci
1
2
3
4
5
6
7
8
9
10
11
12

function fibonacci(i, n, f1, f2, res) {
if (i >= n)
res.end(n + ": " + (f1 + f2));
e...
Fibonacci
Requests per second: 264.55
Time per request: 3.780 ms
Streams
bit.ly/streams-­‐‑node
Streams
0.10.x
bit.ly/streams-­‐‑node
1

$ cut -f 1 | uniq -c | sort -n
Streams  in  Node.JS
Streams  in  Node.JS
1.   fs  -­‐‑  createReadStream,  createWriteStream
Streams  in  Node.JS
1.   fs  -­‐‑  createReadStream,  createWriteStream
2.   process  -­‐‑  stdin,  stderr  and  stdout
Streams  in  Node.JS
1.   fs  -­‐‑  createReadStream,  createWriteStream
2.   process  -­‐‑  stdin,  stderr  and  stdout
3...
Streams  in  Node.JS
1.   fs  -­‐‑  createReadStream,  createWriteStream
2.   process  -­‐‑  stdin,  stderr  and  stdout
3...
Streams  in  Node.JS
1.   fs  -­‐‑  createReadStream,  createWriteStream
2.   process  -­‐‑  stdin,  stderr  and  stdout
3...
Streams  in  Node.JS
1.   fs  -­‐‑  createReadStream,  createWriteStream
2.   process  -­‐‑  stdin,  stderr  and  stdout
3...
Crypto  service
1

var app = require('express')();
Crypto  service
1

var app = require('express')();

1
2
3
4

app.post('/:algo/:secret', function(req, res) {
// Some magic...
Crypto  service
1

var app = require('express')();

1
2
3
4

app.post('/:algo/:secret', function(req, res) {
// Some magic...
Crypto  stdin
1
2
3
4
5
6

var cipher = require('crypto')
.createCipher('aes192', 'secret');
process.stdin.pipe(cipher).pi...
Crypto  service
1

var app = require('express')();

1
2
3
4
5

app.get('/:algo/:secret', function(req, res) {
var cipher =...
Push  vs  Pull  streams
Pull  streams
Push  streams
Streams  in  Node.JS  are  Push
ReadableStream.  Events:
data,  end,  close,  error,  readable
ReadableStream
data  event
1
2
3
4

process.stdin.on('data',
function(chunk) {
console.log(chunk);
});
WriteableStream.  Events
finish,  pipe,  unpipe,  drain
WriteableStream.  Methods
write  method
1

var backpressure = process.stdout.write('data');
Writeable  stream
backpressure
1

var backpressure = process.stdout.write('data');
Writeable  stream
backpressure
1

var backpressure = process.stdout.write('data');

This  return  value  is  strictly  adv...
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Всеволод Струкчинский: Node.js
Upcoming SlideShare
Loading in …5
×

Всеволод Струкчинский: Node.js

9,324 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
9,324
On SlideShare
0
From Embeds
0
Number of Embeds
8,410
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Всеволод Струкчинский: Node.js

  1. 1. @floatdrop bit.ly/nodejs-­‐‑shri
  2. 2. Node.JS
  3. 3. History bit.ly/crcfd
  4. 4.   1987
  5. 5. 1 2 on mouseUp 3 get the selection 4 if it is empty then as "Dial what number?" 5 if it is not empty then 6 push this card 7 visual effect zoom open 8 go to stack "Phone" 9 dial it 10 pop card 11 end if 12 end mouseUp 13 1987
  6. 6. 1995
  7. 7. Расчитан  на  обработку  событий 1995
  8. 8. Расчитан  на  обработку  событий Был  написан  за   1995  дней
  9. 9. Расчитан  на  обработку  событий Был  написан  за   10  дней 1995
  10. 10. Расчитан  на  обработку  событий 10 Был  написан  за    дней Function  as  first-­‐‑class  objects 1995
  11. 11. Расчитан  на  обработку  событий 10 Был  написан  за    дней Function  as  first-­‐‑class  objects Прототипное  наследование  из  Self 1995
  12. 12. 2005
  13. 13. 2005
  14. 14. AJAX 2005
  15. 15. 2009
  16. 16. Node.JS JavaScript  on  server 2009
  17. 17. Apache  +  PHP  =  ❤
  18. 18. Apache  +  PHP  =  ❤
  19. 19. index.php 1 2 3 4 5 6 7 8 9 $result = mysqli_query( $con, "SELECT * FROM Persons"); while($row = mysqli_fetch_array($result)) { echo $row['Name']."n"; } file_put_contents("access.log", "Request done")
  20. 20. Single-­‐‑thread  server Pictures  from  node-­‐‑explained
  21. 21. Single-­‐‑thread  server Pictures  from  node-­‐‑explained
  22. 22. Single-­‐‑thread  server Pictures  from  node-­‐‑explained
  23. 23. Single-­‐‑thread  server Pictures  from  node-­‐‑explained
  24. 24. Single-­‐‑thread  server Pictures  from  node-­‐‑explained
  25. 25. Multi-­‐‑thread  server
  26. 26.    
  27. 27. Ryan  Dahl    
  28. 28. Ryan  Dahl   I/O  has  to  be  done  differently. We  are  doing  it  wrong  
  29. 29. Ryan  Dahl   I/O  has  to  be  done  differently. We  are  doing  it  wrong   bit.ly/jsconf-­‐‑node
  30. 30. event-­‐‑loop  сервер
  31. 31. event-­‐‑loop  сервер
  32. 32. event-­‐‑loop  сервер
  33. 33. event-­‐‑loop  сервер
  34. 34. event-­‐‑loop  сервер
  35. 35. event-­‐‑loop  сервер
  36. 36. event-­‐‑loop  сервер
  37. 37. event-­‐‑loop  server
  38. 38. bit.ly/bombanulo
  39. 39. event-­‐‑loop  server goes  wrong
  40. 40. JavaScript  is  slow bit.ly/bombanulo-­‐‑2
  41. 41. "ʺSimple"ʺ  benchmark bit.ly/dumb-­‐‑test
  42. 42. Installing nodejs.org/download
  43. 43. Running
  44. 44. Running
  45. 45. Running
  46. 46. Running
  47. 47. windows
  48. 48. window
  49. 49. document
  50. 50. document
  51. 51. global
  52. 52. global
  53. 53. global
  54. 54. process
  55. 55. process
  56. 56. process
  57. 57. Modules require('ʹantigravity'ʹ)
  58. 58. module.js 1 2 3 4 5 function HelloWorld () { console.log('Hello world'); } console.log('Module loaded');
  59. 59. index.js 1 require('./module');
  60. 60. index.js 1 2 3 require('./module'); HelloWorld();
  61. 61. module.js 1 2 3 4 5 6 7 function HelloWorld () { console.log('Hello world'); } console.log('Module loaded'); exports.HelloWorld = HelloWorld;
  62. 62. index.js 1 2 3 var module = require('./module'); module.HelloWorld();
  63. 63. module.js 1 2 3 4 5 6 7 function HelloWorld () { console.log('Hello world'); } console.log('Module loaded'); global.HelloWorld = HelloWorld;
  64. 64. index.js 1 2 3 require('./module'); HelloWorld();
  65. 65. exports  vs  module.exports
  66. 66. exports  vs  module.exports russian.js 1 2 3 4 5 6 var en_translation = { yes: 'Нет', no: 'Да' }; exports = en_translation;
  67. 67. exports  vs  module.exports russian.js 1 2 3 4 5 6 var en_translation = { yes: 'Да', no: 'Нет' }; module.exports = en_translation;
  68. 68. exports  vs  module.exports russian.json { "yes": "да", "no": "нет" }
  69. 69. requrie('ʹ./directory'ʹ)
  70. 70. requrie('ʹ./directory'ʹ) 3.   require('ʹ./directory/index.json'ʹ)
  71. 71. requrie('ʹ./directory'ʹ) 3.   require('ʹ./directory/index.json'ʹ) 2.   require('ʹ./directory/index.js'ʹ)
  72. 72. requrie('ʹ./directory'ʹ) 3.   require('ʹ./directory/index.json'ʹ) 2.   require('ʹ./directory/index.js'ʹ) 1.   require('ʹ./directory/'ʹ  + require('ʹ./directory/package.json'ʹ).main);
  73. 73. require('http') require('express') require('./index.js') require('./config.json') require('./module') // Directory
  74. 74. Simple  web-­‐‑server
  75. 75. Simple  web-­‐‑server
  76. 76. Simple  web-­‐‑server
  77. 77. Simple  web-­‐‑server
  78. 78. Simple  web-­‐‑server
  79. 79. Simple  web-­‐‑server index.js 1 2 3 4 5 6 7 8 9 var http = require('http'); function helloService(request, response) { response.end("Hello, stranger!"); } var server = http.createServer(helloService); module.exports = server;
  80. 80. Run,  Forest,  Run!
  81. 81. Run,  Forest,  Run!
  82. 82. Run,  Forest,  Run!
  83. 83. Run,  Forest,  Run!
  84. 84. Simple  web-­‐‑server node_modules
  85. 85. Run,  Forest,  Run!
  86. 86. Run,  Forest,  Run!
  87. 87. Run,  Forest,  Run!
  88. 88. Run,  Forest,  Run!
  89. 89. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js
  90. 90. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js 1.   /home/user/programm/library/node_modules/antigravity
  91. 91. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js 1.   /home/user/programm/library/node_modules/antigravity 2.   /home/user/programm/node_modules/antigravity
  92. 92. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js 1.   /home/user/programm/library/node_modules/antigravity 2.   /home/user/programm/node_modules/antigravity 3.   /home/user/node_modules/antigravity
  93. 93. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js 1.   /home/user/programm/library/node_modules/antigravity 2.   /home/user/programm/node_modules/antigravity 3.   /home/user/node_modules/antigravity 4.   /home/node_modules/antigravity
  94. 94. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js 1.   /home/user/programm/library/node_modules/antigravity 2.   /home/user/programm/node_modules/antigravity 3.   /home/user/node_modules/antigravity 4.   /home/node_modules/antigravity 5.   /node_modules/antigravity
  95. 95. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js 1.   /home/user/programm/library/node_modules/antigravity 2.   /home/user/programm/node_modules/antigravity 3.   /home/user/node_modules/antigravity 4.   /home/node_modules/antigravity 5.   /node_modules/antigravity NODE_PATH
  96. 96. require("ʺantigravity"ʺ) in  /home/user/programm/library/index.js 1.   /home/user/programm/library/node_modules/antigravity 2.   /home/user/programm/node_modules/antigravity 3.   /home/user/node_modules/antigravity 4.   /home/node_modules/antigravity 5.   /node_modules/antigravity NODE_PATH $HOME/.node_modules,  $HOME/.node_libraries,  $PREFIX/lib/node
  97. 97. node_modules/antigravity.js 1 module.exports = new Date(); index.js 1 console.log(require("antigravity"));
  98. 98. node_modules/antigravity.js 1 2 3 console.log(module); module.exports = new Date();
  99. 99. Circular  dependencies
  100. 100. Circular  dependencies a.js 1 2 var b = require('./b.js'); console.log("B: ", b); b.js 1 2 var a = require('./a.js'); console.log("A: ", a);
  101. 101. Circular  dependencies a.js 1 2 3 4 module.exports.hello = "Hello from A"; var b = require('./b.js'); module.exports.helloFromB = b.hello; console.log("B: ", b); b.js 1 2 3 4 module.exports.hello = "Hello from B"; var a = require('./a.js'); module.exports.helloFromA = a.hello; console.log("A: ", a);
  102. 102. modulecounts.com
  103. 103. Installing  module
  104. 104. Installing  module
  105. 105. Installing  module
  106. 106. Installing  module
  107. 107. Installing  module
  108. 108. Nested  dependencies pros  /  cons
  109. 109. Nested  dependencies pros  /  cons +  Version  independent
  110. 110. Nested  dependencies pros  /  cons +  Version  independent -­‐‑  Wieght  more
  111. 111. package.json { } "name": "express", "version": "3.4.4", "dependencies": { "connect": "2.11.0", "commander": "1.3.2", "range-parser }, "devDependencies": { "ejs": "*", "mocha": "*", "jade": "0.30.0", "hjs": "*", " }, "main": "index", "bin": { "express": "./bin/express" }, "scripts": { "prepublish": "npm prune", "test": "make test" }, "engines": { "node": "*" }
  112. 112. Express  application var express = require('express'); var app = express(); app.get('/', function(req, res) { res.end('Hello!'); }); app.listen(3000);
  113. 113. Event  loop
  114. 114. bit.ly/kantor-­‐‑node
  115. 115. joyent/node  -­‐‑  node.cc
  116. 116. joyent/node  -­‐‑  env-­‐‑inl.h
  117. 117. joyent/node  -­‐‑  env-­‐‑inl.h
  118. 118. joyent/libuv  -­‐‑  loop.c
  119. 119. joyent/libuv  -­‐‑  loop.c 1 static int uv__loop_init(uv_loop_t* loop, int default_loop) { 2 // ... 3 RB_INIT(&loop->timer_handles); 4 QUEUE_INIT(&loop->wq); 5 QUEUE_INIT(&loop->active_reqs); 6 QUEUE_INIT(&loop->idle_handles); 7 QUEUE_INIT(&loop->async_handles); 8 QUEUE_INIT(&loop->check_handles); 9 QUEUE_INIT(&loop->prepare_handles); 10 QUEUE_INIT(&loop->handle_queue); 11 QUEUE_INIT(&loop->pending_queue); 12 QUEUE_INIT(&loop->watcher_queue); 13 14 err = uv__platform_loop_init(loop, default_loop); 15 // ... 16 }
  120. 120. uv__platform_loop_init kqueue epoll
  121. 121. joyent/node  -­‐‑  node.cc
  122. 122. joyent/node  -­‐‑  core.c   :  258 1 int uv_run(uv_loop_t* loop, uv_run_mode mode) { 2 r = uv__loop_alive(loop); 3 while (r != 0 && loop->stop_flag == 0) { 4 // ... 5 uv__update_time(loop); 6 uv__run_timers(loop); 7 uv__io_poll(loop, timeout); 8 // ... 9 } 10 } 1 2 3 4 5 static int uv__loop_alive(uv_loop_t* loop) { return uv__has_active_handles(loop) || uv__has_active_reqs(loop) || loop->closing_handles != NULL; }
  123. 123. Fibonacci 1 2 3 4 5 6 7 8 9 10 function fibonacci(n) { if (n < 2) return 1; else return fibonacci(n-2) + fibonacci(n-1); } require('http').createServer(function (req, res) { res.end("40: " + fibonacci(40)); }).listen(8005);
  124. 124. Fibonacci Requests per second: 0.61 Time per request: 1634.748 ms (vs 5676 ms)
  125. 125. setTimeout,  setImmediate, process.nextTick
  126. 126. 1.   process.nextTick
  127. 127. 1.   process.nextTick* 2.   Input  /  Output
  128. 128. 1.   process.nextTick* 2.   Input  /  Output 3.   setImmediate
  129. 129. 1.   process.nextTick* 2.   Input  /  Output 3.   setImmediate 4.   setTimeout
  130. 130. Fibonacci 1 2 3 4 5 6 7 8 9 10 11 12 function fibonacci(i, n, f1, f2, res) { if (i >= n) res.end(n + ": " + (f1 + f2)); else setImmediate(function() { fibonacci(i + 1, n, f2, f1 + f2, res); }); } require('http').createServer(function (req, res) { fibonacci(0, 1473, 1, 1, res); }).listen(8005);
  131. 131. Fibonacci Requests per second: 264.55 Time per request: 3.780 ms
  132. 132. Streams bit.ly/streams-­‐‑node
  133. 133. Streams 0.10.x bit.ly/streams-­‐‑node
  134. 134. 1 $ cut -f 1 | uniq -c | sort -n
  135. 135. Streams  in  Node.JS
  136. 136. Streams  in  Node.JS 1.   fs  -­‐‑  createReadStream,  createWriteStream
  137. 137. Streams  in  Node.JS 1.   fs  -­‐‑  createReadStream,  createWriteStream 2.   process  -­‐‑  stdin,  stderr  and  stdout
  138. 138. Streams  in  Node.JS 1.   fs  -­‐‑  createReadStream,  createWriteStream 2.   process  -­‐‑  stdin,  stderr  and  stdout 3.   http  -­‐‑  client  requests,  server  response
  139. 139. Streams  in  Node.JS 1.   fs  -­‐‑  createReadStream,  createWriteStream 2.   process  -­‐‑  stdin,  stderr  and  stdout 3.   http  -­‐‑  client  requests,  server  response 4.   tcp  -­‐‑  sockets
  140. 140. Streams  in  Node.JS 1.   fs  -­‐‑  createReadStream,  createWriteStream 2.   process  -­‐‑  stdin,  stderr  and  stdout 3.   http  -­‐‑  client  requests,  server  response 4.   tcp  -­‐‑  sockets 5.   zlib  -­‐‑  createUnzip...
  141. 141. Streams  in  Node.JS 1.   fs  -­‐‑  createReadStream,  createWriteStream 2.   process  -­‐‑  stdin,  stderr  and  stdout 3.   http  -­‐‑  client  requests,  server  response 4.   tcp  -­‐‑  sockets 5.   zlib  -­‐‑  createUnzip... 6.   crypto  -­‐‑  createCipher
  142. 142. Crypto  service 1 var app = require('express')();
  143. 143. Crypto  service 1 var app = require('express')(); 1 2 3 4 app.post('/:algo/:secret', function(req, res) { // Some magic should be applied here res.end(req.params.algo + " " + req.params.secret); });
  144. 144. Crypto  service 1 var app = require('express')(); 1 2 3 4 app.post('/:algo/:secret', function(req, res) { // Some magic should be applied here res.end(req.params.algo + " " + req.params.secret); }); 1 app.listen(31337);
  145. 145. Crypto  stdin 1 2 3 4 5 6 var cipher = require('crypto') .createCipher('aes192', 'secret'); process.stdin.pipe(cipher).pipe(process.stdout);
  146. 146. Crypto  service 1 var app = require('express')(); 1 2 3 4 5 app.get('/:algo/:secret', function(req, res) { var cipher = require('crypto') .createCipher(req.params.algo, req.params.secret); req.pipe(cipher).pipe(res); }); 1 app.listen(31337);
  147. 147. Push  vs  Pull  streams
  148. 148. Pull  streams
  149. 149. Push  streams
  150. 150. Streams  in  Node.JS  are  Push
  151. 151. ReadableStream.  Events: data,  end,  close,  error,  readable
  152. 152. ReadableStream data  event 1 2 3 4 process.stdin.on('data', function(chunk) { console.log(chunk); });
  153. 153. WriteableStream.  Events finish,  pipe,  unpipe,  drain
  154. 154. WriteableStream.  Methods write  method 1 var backpressure = process.stdout.write('data');
  155. 155. Writeable  stream backpressure 1 var backpressure = process.stdout.write('data');
  156. 156. Writeable  stream backpressure 1 var backpressure = process.stdout.write('data'); This  return  value  is  strictly  advisory.  You  MAY  continue to  write,  even  if  it  returns  false.  However,  writes  will  be buffered  in  memory,  so  it  is  best  not  to  do  this excessively.  Instead,  wait  for  the  drain  event  before writing  more  data.

×