Upload
ganesh-kondal
View
1.192
Download
0
Embed Size (px)
DESCRIPTION
Node JS - Server side JS platform. An introduction.
Citation preview
Node.js – Server Side JavaScript
Ganesh KondalJune 13, 2014
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
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
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
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
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.
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
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.
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]
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]
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]
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/
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
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
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
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
Node JS – UI Template
• Jade is a server side templating engine – like Thymeleaf, JSP, ASP• Short syntax to create HTML
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
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
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
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
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
Next Session
• File handlers, Streams
• Event Emitters
• Error, Exception Handling
• Socket.IO
• Build & Deploy – using Grunt
• JS CoE – Seed project for node
Thank You
24
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/
Reference
26
THANK YOU
Appendix
27
Appendix
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