17. (A)typical web–server work
Persistent connections
= ∞ simultaneous connections
≈ 10000 simultaneous connections
(But we don’t care as much about latency. . . )
9/66
21. Response time w. sleep(1).
25 s
WSGI
20 s
Average response time
15 s
10 s
5s
0s
0 100 200 300 400 500 600 700 800 900 1000
Concurrent requests
13/66
22. Response time w. sleep(1).
25 s
WSGI
20 s
Average response time
15 s
10 s
5s
0s
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
Concurrent requests
14/66
27. Response time w. sleep(1).
25 s
WSGI
Apache
20 s
Average response time
15 s
10 s
5s
0s
0 100 200 300 400 500 600 700 800 900 1000
Concurrent requests
19/66
28. Response time w. sleep(1).
25 s
WSGI
Apache
20 s
Average response time
15 s
10 s
5s
0s
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
Concurrent requests
20/66
78. JavaScript
Built for event-based programming.
44/66
79. JavaScript
Built for event-based programming.
44/66
80. JavaScript
Built for event-based programming.
Netscape needed something fast. . .
44/66
81. JavaScript
Built for event-based programming.
Netscape needed something fast. . .
. . . JavaScript “designed” and implemented in 14 days
44/66
82. JavaScript
Built for event-based programming.
Netscape needed something fast. . .
. . . JavaScript “designed” and implemented in 14 days
44/66
83. Google V8
JIT’ing JavaScript to native machine code
45/66
84. Google V8
JIT’ing JavaScript to native machine code
= Compiling server code
45/66
85. Node.js
Non–browser V8–bindings for various libraries
Everything non–blocking
46/66
86. A minimal webserver in Node.js. . .
// Import HTTP package
var http = require ( ’ http ’) ;
// Set up basic server
var server = http . createServer ( function ( req , res ) {
res . writeHead (200 , { ’ Content - Type ’: ’ text / plain ’ }) ;
res . end ( ’ Hello World n ’) ;
}) ;
// Start the server
server . listen (8124 , " 127.0.0.1 " ) ;
console . log ( ’ Server running at http : / / 1 2 7 . 0 . 0 . 1 : 8 1 2 4 / ’) ;
47/66
87. . . . with “database”
// Import HTTP package
var http = require ( ’ http ’) ;
// Set up basic server
var server = http . createServer ( function ( req , res ) {
setTimeout ( function () {
res . writeHead (200 , { ’ Content - Type ’: ’ text / plain ’ }) ;
res . end ( ’ Hello World n ’) ;
} , 1000) ;
}) ;
// Start the server
server . listen (8124 , " 127.0.0.1 " ) ;
console . log ( ’ Server running at http : / / 1 2 7 . 0 . 0 . 1 : 8 1 2 4 / ’) ;
48/66
88. Response time w. sleep(1).
25 s
WSGI
Apache
Node.js
20 s
Average response time
15 s
10 s
5s
0s
0 100 200 300 400 500 600 700 800 900 1000
Concurrent requests
49/66
89. Response time w. sleep(1).
25 s
WSGI
Apache
Node.js
20 s
Average response time
15 s
10 s
5s
0s
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
Concurrent requests
50/66
109. Nice code!
def process ( user ) :
user = getAuth ( user )
if not user :
return ’ Fail ’
db = getC onnnecti on ( params )
data = db . getUserData ( user )
if not data :
return ’ Fail ’
return data
59/66
110. Boomerang code
function process ( user , callback ) {
getAuth ( req . username , function ( err , user ) {
if ( err ) return callback ( err ) ;
g etDB Co n ne ct io n ( params , function ( err , db ) {
if ( err ) return callback ( err ) ;
db . getUserData ( user , function ( err , data ) {
if ( err ) return callback ( err ) ;
return callback ( null , data ) ;
}) ;
}) ;
}) ;
}
60/66
116. function process ( user , callback ) {
var user = null , db = null ;
function done_ () {
if ( user && db ) {
db . getUserData ( user , function ( err , data ) {
if ( err ) return callback ( err ) ;
return callback ( null , data ) ;
}) ;
}
}
getAuth ( req . username , function ( err , retuser ) {
if ( err ) return callback ( err ) ;
user = retuser ;
done_ () ;
}) ;
g et DBCo n ne ct i on ( params , function ( err , retdb ) {
if ( err ) return callback ( err ) ;
db = retdb ;
done_ () ;
}) ;
}
66/66