Node.js as a solid pillar of your web/mobile app

Tomasz Banasiak

Node.js - A solid pillar for your web/mobile app.

WHo i am?

Node.js - A solid pillar for your web/mobile app.

WEBMESSENGER SERVER

TFL NOTIFICATIONS

AUTOGUARD

NODE.js IN RST

Here we go!

Node.js - A solid pillar for your web/mobile app.

TO BE OR NOT TO BE...

SYNCHRONOUS

Node.js - A solid pillar for your web/mobile app.

$db = $this->getDatabase();

$query = 'SELECT giant_field, COUNT(field) AS counter
    FROM massive_table mt
    LEFT JOIN even_bigger_table ebt ON mt.field1 = ebt.field2
    WHERE ebt.field3 = \'Zosia\'
    ORDER BY mt.date DESC
    HAVING counter > 1000';

$result = $db->query($query)->fetchAll();

Node.js - A solid pillar for your web/mobile app.

What is the software doing while it queries a database? 

NOTHING

It just waits for the response...

Node.js - A solid pillar for your web/mobile app.

Is this something to really deal about?

Node.js - A solid pillar for your web/mobile app.

What SERVER's CPU is doing

Process

request

Query

Database

Fetching

Result

Process

Response

Send 

Response

Node.js - A solid pillar for your web/mobile app.

What about THE REST?

Process

request

Query

Database

Fetching

Result

Process

Response

Send 

Response

  ?                            ?                                                  ?                                ?                      ?                 ?

Node.js - A solid pillar for your web/mobile app.

Server is waiting for the I/O

Node.js - A solid pillar for your web/mobile app.

Node.js - A solid pillar for your web/mobile app.

Node.js - A solid pillar for your web/mobile app.

EVENT LOOP CPU UTILIZATION

  • JuSt small gaps for context switching

  • One thread, many consequent requests

  • Separated IO operations

 

Node.js - A solid pillar for your web/mobile app.

var mysql = require('mysql');
var db = mysql.connection('user:pass@localhost:3306/nodetest1');

var sql = 'SELECT giant_field, COUNT(field) AS counter
    FROM massive_table mt
    LEFT JOIN even_bigger_table ebt ON mt.field1 = ebt.field2
    WHERE ebt.field3 = \'Zosia\'
    ORDER BY mt.date DESC
    HAVING counter > 1000';

db.query(sql, function(data) {
    response.setData(data);
    response.send();
}

Node.js - A solid pillar for your web/mobile app.

PROBLEM?

Node.js - A solid pillar for your web/mobile app.

app.get('/user/:userId', function(req, res, next) {
    db.get('users', userId, function(err, user) {
        /** code **/
        callbackCounter++;
        locals.user = user;
        if (callbackCounter == 2) {
            res.render('user-profile', locals);
        }
    });
    db.query('posts', {userId: userId}, function(err, posts) {
        /** code **/
        locals.posts = posts;
        callbackCounter++;
        if (callbackCounter == 2) {
            res.render('user-profile', locals);
        }
    });
});

Node.js - A solid pillar for your web/mobile app.

ASYNC.js

Node.js - A solid pillar for your web/mobile app.

app.get('/user/:userId', function(req, res, next) {
  async.parallel([
    function(callback) {
      db.get('users', userId, function(err, user) {
          locals.user = user;
          callback();
        });
    },
    function(callback) {
      db.query('posts', {userId: userId}, function(err, posts) {
         locals.posts = posts;
         callback();
      });
    }
 ], function(err) { 
      if (err) return next(err); 
      res.render('user-profile', locals);
   });
});

NODE.jS VS.  OTHERS

Node.js - A solid pillar for your web/mobile app.

One request memory usage

Tomcat 
IIS
Apache
lighttpd
nginx
Node.js

198 MB
155 MB
50 MB
18 MB
8 MB
3 MB

Source: jsconf.eu/2014

Node.js - A solid pillar for your web/mobile app.

Node.js vs Apache2

Node.js - A solid pillar for your web/mobile app.

Node.js vs Apache2

Node.js - A solid pillar for your web/mobile app.

IS NODE.js PERFECT SOLUTION FOR ALL PROBLEMS?

NO.

Node.js - A solid pillar for your web/mobile app.

NODE.js IS PERFECT SOLUTION FOR:

  • One-to-many notifications

  • Middleware, eg. for socket.io

  • SPA application backend

  • Lots of short, non CPU-heavy tasks

  • Event bus

Node.js - A solid pillar for your web/mobile app.

NODE.js IS Nice SOLUTION FOR:

  • Lightweight backend for mobile apps

  • embedded software for raspberry pi

  • arduino controller backend

  • every kind of chat applications

  • server processing monitor

  • STANDALONE APPS :) 

Node.js - A solid pillar for your web/mobile app.

NODE.js IS WRONG SOLUTION FOR:

  • Handle mainly all backend services

  • Uplodad/serve large files (but they're about to fix it)

  • loadbalanced services

  • CDN services

  • Computation services

Node.js - A solid pillar for your web/mobile app.

NODE.js IS STILL A REALLY YOUNG TECHNOLOGY

  • Created in 2009

  • First "usable" release in 2011

Node.js - A solid pillar for your web/mobile app.

NODE.js IS FUTURE TECHNOLOGY

  • JAVASCRIPT IS A RISING POWER

  • NATIVE OPERATION ON ANY DEVICE

  • LOW LEARNING CURVE

Node.js - A solid pillar for your web/mobile app.

NODE.js IS FUTURE TECHNOLOGY

  • Java            +4,2%

  • C#              +3,4%

  • .NET             +10,1%

  • PHP              +8,8%

  • Node.js/JS +21,6% 

  • Android     +12,4%

careers.stackoverflow.com

Node.js - A solid pillar for your web/mobile app.

NODE.js IS FUTURE TECHNOLOGY

http://adambard.com/blog/top-github-languages-2014/

Node.js - A solid pillar for your web/mobile app.

NODE.js SUCCESS STORIES

Node.js - A solid pillar for your web/mobile app.

PayPal

https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/

Build a Node.js version of their Java-based app in half the time with fewer developers

  • Written in 33% fewer lines of code

  • Constructed with 40% fewer files

Node.js - A solid pillar for your web/mobile app.

PayPal

https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/

Node.js - A solid pillar for your web/mobile app.

PayPal

https://www.paypal-engineering.com/2013/11/22/node-js-at-paypal/

  • Double the requests per second vs. the Java application

  • 35% decrease in the average response time

  • FROM 1 TO 12 Node apps IN six months

Node.js - A solid pillar for your web/mobile app.

PayPal

"We are moving every product & every site within PayPal to Node. We started the journey by using it as prototyping framework, then at start of this year we hardened it to work with all PayPal systems. We have several of our beta products out live on NodeJS and half dozen other products in flight. By end of 2014 we hope to have all major experiences redesigned, and rewritten on nodejs."

Bill Scott, nov 2013

Node.js - A solid pillar for your web/mobile app.

GROUPON

https://engineering.groupon.com/2014/misc/shopping-cart/

  • EASILY HANDLING 50K REQS/MIN WITH HALF OF USED HARDWARE

  • 45% decrease in the average response time

  • WHOLE SHOPPING PROCESS HANDLED BY Node.js

Node.js - A solid pillar for your web/mobile app.

WALLMART

http://thechangelog.com/116/

  • 55% of all traffic  on black friday went to Node.js servers 

  • Not a single Node server went down. Zero.

  • cpu loads hovered around 1-2%

  • Developers were so bored that day :)

Node.js - A solid pillar for your web/mobile app.

STILL NOT CONVINCED?

https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node

Node.js - A solid pillar for your web/mobile app.

THE DARK SIDE

Node.js - A solid pillar for your web/mobile app.

PAINFUL DEBUGGING

Node.js - A solid pillar for your web/mobile app.

PAINFUL DEBUGGING

Walmart Node.js Memory Leak

http://www.joyent.com/blog/walmart-node-js-memory-leak

Node.js - A solid pillar for your web/mobile app.

THE GIANT SPLIT

Node.js

IO.js

Node.js - A solid pillar for your web/mobile app.

There's an alternative!

Python + twisted

RUBY + EVENTMACHINE

ESB WSO2

BUT THIS IS STILL JUST A MIDDLEWARE..

VERTX JVM

Node.js - A solid pillar for your web/mobile app.

There's an alternative!

GO

Node.js - A solid pillar for your web/mobile app.

There's an alternative!

import ( "io/db", "fmt", "http" )
func main() {
    err, user := db.get('users', userId)
    err, posts := db.query('posts', 
        fmt.Concat('user_id = ',userId)
    )
    http.response := render(user, posts)
    http.send()
    http.close()
}
    

Node.js - A solid pillar for your web/mobile app.

There's an alternative!

Python + twisted

RUBY + EVENT MACHINE

ESB WSO2

BUT THIS IS STILL JUST A MIDDLEWARE..

VERTX JVM

Node.js - A solid pillar for your web/mobile app.

ESB WSO2 VS NODE.jS

  • Powerful

  • Elastic

  • Universal

  • HEAVY

  • java

  • DO WE NEED THIS?

  • Powerful

  • Elastic

  • JSON

  • LIGHTWEIGHT

  • NPM PACKAGES

  • MODERN TECHNOLOGY

  • BUT IMMATURE

Node.js - A solid pillar for your web/mobile app.

ESB WSO2 VS NODE.jS

Microsoft Azure uses NODE.js as ESB

NODE WORKS PERFECTLY WITH AMQP

MAYBE ITS TIME TO RETHINK OUR direction

BEFORE WE BUILD A...

SWARM ESB

Node.js - A solid pillar for your web/mobile app.

Node.js - A solid pillar for your web/mobile app.

Questions?

Thank you!

Tomasz Banasiak

Email:  tomasz.banasiak@rst.com.pl

WEB:     http://banasiak.pro

Made with Slides.com