NodeJS - Server Side JS

28
Node.js – Server Side JavaScript Ganesh Kondal June 13, 2014

description

Node JS - Server side JS platform. An introduction.

Transcript of NodeJS - Server Side JS

Page 1: NodeJS - Server Side JS

Node.js – Server Side JavaScript

Ganesh KondalJune 13, 2014

Page 2: NodeJS - Server Side JS

Agenda

• Intent

• Node JS – Background & Overview

• JS Basics

• Pre-Cursors • Installation, Setup, IDE & NPM• JS Basics – callback, blocking & non-blocking I/O • NodeJS –Modules, simple server

• Node JS Architecture

• Blocking vs. Non-Blocking I/O – Comparison

• Web Application with Express MVC• Project – Code Structure• App Development Sequence• Code Parts – UI Template, Router, Database invocation

• Industry Adoption

• Applicability – Suited / Not Suited for

• Next Session – Topics

Page 3: NodeJS - Server Side JS

Intent

• To introduce listeners to the NodeJS platform; discuss the key aspect of non-blocking I/O; run through a sample web app developed using Express framework

• An hour of glimpsing around NodeJS – Nothing else

Follow-up

Follow-up sessions will extend the sample application to work with files, show case a socket I/O based file explorer and integrate with NoSQL databases like MongoDB

Page 4: NodeJS - Server Side JS

4

Node JS – Background

• Node.js runs on V8 Javascript Engine

• V8 is Google’s open source engine; written in C++ for Chrome

• Created by Ryan Dahl in 2009 and first published in 2011

• Runs on Linux and Windows

• Development and Maintenance of NodeJS is done by Joyent

• Written in C/C++ (80%) and JavaScript (20%) and it is open source.

Overview

• Node.js is ‘server-side JavaScript’; event-driven async I/O

• Well optimized for high concurrency, high performance and network applications

• Uses an event-driven, non-blocking I/O model.

• Non-blocking I/O happens via JavaScript’s callbacks.

• Programs for Node.js are written in JavaScript [not DOM manipulation like in jQuery]

• Node JS executes in a single threaded fashion

Page 5: NodeJS - Server Side JS

5

Pre-Cursors

• Installation• From website or• Homebrew (mac OS) or Synaptic (Ubuntu)

• IDE – • JetBrains WebStorm 8.0.1 OR • Sublime Text OR • Eclipse with nodeclipse

• NPM • Node Package Manager enables get third party modules• Two modes

• Global - installs modules c:\users\356992\appdata…• Local – in the same directory under node_modules

• Works based on package.json in the root folder• Comes packaged with Node installation

Open Source Node Repository

Page 6: NodeJS - Server Side JS

6

JavaScript – Basics

s1

s2

s3

s4

s5

• Functions in JavaScript are objects – first class citizens• Essentially, you can pass a function as a variable to another function call

• Closure

Callbacks are – a Functional programming paradigm

Callbacks a.k.a Higher-Order function

Only the function definition is passed; function is not executed

A closure is an inner function that has access to the outer (enclosing) function’s variables—scope chain

• When callback is invoked, if there is a ‘this’ reference; it will be ‘undefined’ • Handling ‘this’ in a callback is via JS methods of ‘apply(..)’ or ‘call(..)’ OR • Have the ‘this’ stored in a variable called ‘self’ and use it.

Page 7: NodeJS - Server Side JS

7

Event Driven Programming – Blocking, Non-Blocking I/O

s1

s2

s3

s4

s5

Traditional I/O

Non-blocking I/O

var result = db.query(“select x,y from tableXY”);doSomethingWithResult(result); //waits for the result! doSomethingWithoutResult(); //execution is un-necessarily blocked!

db.query(“select x, y from tableXY”, function (result){

// gets called once the result is ready! doSomethingWithResult(result); });doSomethingWithoutResult(); //executes without any delay!

Callback on db query completion event

Page 8: NodeJS - Server Side JS

8

Fundamentals – Modules, Sample Code

• Modules• Referenced by file path or file name• No Global Scope in NodeJS • Modules are loaded only once• Libraries in node are packages/modules

Module 1 Module s5

s1

s2

s3 s4

s1

s2

Global Scope

Scripts within a module context

• Sample – Web Server in 3 lines

Classic Browser Runtime

Node Runtime & Scope

s3

s4

s5

Loads the ‘http’ module

Function that handles the incoming requests. Executed by the main thread of node.

Page 9: NodeJS - Server Side JS

Multi-Threaded HTTP Server – Blocking I/O

• On heavy load – we see more threads that leads to more context switching which in turn leads to more CPU / Memory usage

• Classic discussion on threads vs. events is in Benjamin Erb’s Thesis

[Strongloop, 2014]

Page 10: NodeJS - Server Side JS

Node JS Architecture – Non-Blocking I/O

• On heavy load – we see more threads that leads to more context switching which in turn leads to more CPU / Memory usage

• Classic discussion on threads vs. events is in Benjamin Erb’s Thesis

[Strongloop, 2014]

Page 11: NodeJS - Server Side JS

Node JS – Event Loop

• Node is single-threaded• Follows an event-driven

functional programming model

• Errors in the main thread kills the server

• POSIX thread switching is not costly

Million concurrent connections http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

[www.udemy.com, 2014]

Page 12: NodeJS - Server Side JS

Node JS – Event Loop

Client

Event loop

(main thread)

C++ Thread pool

(worker threads)

Clients send HTTP requests to Node.js server

An Event-loop is woken up by OS,passes request and response objectsto the thread-pool

Long-running jobs run on worker threads

Response is sentback to main threadvia callback

Event loop returnsresult to client

• Node is single-threaded• Follows an event-driven

functional programming model

• Errors in the main thread kills the server

Million concurrent connections http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

Page 13: NodeJS - Server Side JS

Java vs. NodeJS –Performance [ Return data with constant sleep]

Java Stack & Description• Java servlet returns ‘hello world’ with a

200ms sleep [ simulating a 200ms DB call]• Executed in Apache Tomcat 6.0, JDK 6• Tomcat runs in a multi-threaded mode &

in a blocking mode

Node v 0.10• Returns a ‘hello world’ equivalent string

with a 200ms timeout set in call• Node JS ran in the (defacto) non-blocking

mode

Not a comparison between Java vs. Node – rather a comparison of blocking and non-blocking I/O

Page 14: NodeJS - Server Side JS

Node JS – Run Sample Web Application

• Use cases we will see • Get the list of players from NoSQL (MongoDB)• Add a player to the list

• STEP 1 – setup • Install Node• Install Express • Install Expres – Genertor • Generate a node express project• Install MongoDB

• STEP 2 – Package.json edit to suit your needs

• STEP 3 – Install dependencies

• STEP 4 – Run

d:\nodejs> npm install express d:\nodejs> npm install express-generator d:\nodejs> express playerlist

d:\nodejs\playerlist> npm install

d:\nodejs\playerlist> npm start

Page 15: NodeJS - Server Side JS

Node JS – Project Structure

Jade HTML Preprocessor

Express Engine

Mongo DB

Monk

Node.js Serverd:\nodejs> npm install express d:\nodejs> npm install express-generator d:\nodejs> express playerlist

V

M

C

Public images, CSS and JS files

URI routing; view attachment

View templates using Jade.

Multiple other options exists – ejs, jade

Mongo DB Data files

• Jade – Template engine. Very short syntax to create a HTML • Monk – Small layer that enables MongoDB a super-easy task within NodeJS

Page 16: NodeJS - Server Side JS

Node JS – Code Parts – MVC

1) Import necessary modules

2) Initialize Express

3) Configure the express app a. Loggerb. Viewsc. Template engined. Static images directorye. …

4) Configure the router

5) Router = Controllera. Connects the model, jade view b. Enables navigation across the URIs

Page 17: NodeJS - Server Side JS

Node JS – UI Template

• Jade is a server side templating engine – like Thymeleaf, JSP, ASP• Short syntax to create HTML

Page 18: NodeJS - Server Side JS

Node JS – Code Parts contd.• Router

• Database

View: Jade template name

View Model: “Model of the view”JSON object passed to the view

1

2

3

Load ‘Mongo’, ‘Monk’ necessary to connect to MongoDB

Put the Mongo DB reference handle to the global request object

db.get - Monk APIs to fetchdb.insert,db.find({},fn) are some of the other relevant APIs

Page 19: NodeJS - Server Side JS

Node JS – Deployment• Simplistic – Newbie mode

• node server.js • Command line execution. No restart; or no monitoring• Dies with the command shell closing

• Little better• node server.js & • Running as a background application in *nix• Will last than the shell that started it

• Script that loops & restarts the server • Still limited the lifeline of the script that starts

• Improvised shell • Cron based monitoring• Log attached • Auto start enabled• External port monitoring enabled for load balancing

While : do

// node server.js // sleep x seconds

done

// description// author// specify port, Ethernet card // attach a cron job – for every minute // start in sudo mode // ensure a log file is rolled // attached the init.d in linux

Page 20: NodeJS - Server Side JS

20

Industry Adoption

Paypal’s Account Overview via NodeJS

• Timeline & Inventory• Built twice as fast as the Java Application • 33% fewer lines of code – compared to the same functionality in

Java /Spring• 40% fewer files

• Performance• Double the requests vs. Java Application• 35% decrease in the average response time • Essentially, page loading is faster than the Java App

• Stack• NodeJS – Server • KrakenJS – Secure and scalable layer that extends Express, which

provides convention• Dust – Asynchronous templates

Page 21: NodeJS - Server Side JS

21

Pros & Cons

Pros• Fast – Execution speed• Faster to market – development speed• Less lines of code• Great community• Proven with high volume systems• Most suited for networking, I/O intensive applications

Cons• Writing event driven code is complex compared to synchronous

code • Writing a large business logic centric system is cumbersome • Callback hell• Exception handling is not straight forward

Page 22: NodeJS - Server Side JS

22

Suitability

Suitable Scenarios• Most suited for networking, I/O intensive applications• Applications that need high concurrency / Queued concurrent inputs• Streaming Applications – like Chat servers• Proxy Service• Real time applications • Monitoring Dashboards

• like Brokerage Dashboard (Node JS + Socket IO)• Application Monitoring

• REST APIs

Not Suited For• Large business logic centric systems• Heavy server side computation is required

Page 23: NodeJS - Server Side JS

Next Session

• File handlers, Streams

• Event Emitters

• Error, Exception Handling

• Socket.IO

• Build & Deploy – using Grunt

• JS CoE – Seed project for node

Page 24: NodeJS - Server Side JS

Thank You

24

Page 25: NodeJS - Server Side JS

Reference

• Ryan Dhals original presentation in JS Confhttp://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf

• Expess framework• http://expressjs.com/guide.htmld

• Node JS - www.nodejs.org

• Event Loop – www.udemy.com

• Strongloop – how nodejs is faster http://strongloop.com/strongblog/node-js-is-faster-than-java/

Page 26: NodeJS - Server Side JS

Reference

26

THANK YOU

Page 27: NodeJS - Server Side JS

Appendix

27

Appendix

Page 28: NodeJS - Server Side JS

Why Node JS is faster [ Return data with constant sleep]

• Asynchronous Non-blocking I/O is the root cause

• Not just I/O alone – all of node js 50k modules are written in an async fashion• Debuggers, monitors, loggers,• Cluster manager• File operation

• Java NIO alone is not enough