SlideShare une entreprise Scribd logo
1  sur  76
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
Have Your Node.js Cake
and Eat It Too
Rob Tweed
M/Gateway Developments Ltd
Twitter: @rtweed
http://www.mgateway.com
Copyright © 2014 M/Gateway Developments Ltd
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
• Just another Node.js framework?
• What's wrong with the ones already
available and used by thousands of
developers?
– Express.js
– Koa
– Meteor
– Hapi
– Sails, etc etc
Copyright © 2014 M/Gateway Developments Ltd
Two reasons
• Achieving the best interface to Cache &
GT.M from JavaScript
– JavaScript as a first-class language and direct
alternative to Cache ObjectScript / Mumps
– Integrating with legacy Cache ObjectScript /
Mumps code that was inherently synchronous
Copyright © 2014 M/Gateway Developments Ltd
Two reasons
• Achieving the best interface to Cache &
GT.M from JavaScript
– JavaScript as a first-class language and direct
alternative to Cache ObjectScript / Mumps
– Integrating with legacy Cache ObjectScript /
Mumps code that was inherently synchronous
– I've been working with Node.js &
Cache/Mumps since 2011 and have tried
everything you can imagine to figure this out!
Copyright © 2014 M/Gateway Developments Ltd
Two reasons
• Achieving the best interface to Cache &
GT.M from JavaScript
– JavaScript as a first-class language and direct
alternative to Cache ObjectScript / Mumps
– Integrating with legacy Cache ObjectScript /
Mumps code that was inherently synchronous
• Addressing some of the deficiencies in
Node.js that are a direct consequence of
its architecture
Copyright © 2014 M/Gateway Developments Ltd
Node.js Architecture
• Everything executes in a single process
– You might have 1000's of users doing stuff
concurrently
• They're all sharing the same process!
Copyright © 2014 M/Gateway Developments Ltd
By Design
• Ryan Dahl, the inventor of Node.js,
wanted to create a highly-scalable, high-
performance architecture for network
programs
– Web servers
– Chat servers
• Showed that the threaded architecture of
Apache had performance limits and heavy
memory usage
Copyright © 2014 M/Gateway Developments Ltd
Node.js Architecture
• Everything executes in a single process
• Non-blocking I/O
– No user activity must block the process, or everyone
grinds to a halt
• Event-driven, asynchronous logic
– Fire off the request, but don't wait for the results
• Carry on with the next task
– When results come back, handle them at the next
opportunity
Copyright © 2014 M/Gateway Developments Ltd
Node.js = server-side JavaScript
• Ryan Dahl wasn't actually a big JavaScript fan
• However, he realised that it was a convenient
language for such an environment, as it's
designed for exactly the same kind of way of
working in the browser
• Google's V8 JavaScript engine was Open
Sourced, so he used it to provide the language
for Node.js
– (which is actually mostly written in C++)
Copyright © 2014 M/Gateway Developments Ltd
Asynchronous Syntax in Other Languages?
• Node.js isn't unique in supporting
asynchronous logic and non-blocking I/O
• Available also in most other modern
languages
– Java
– Python, etc
• Allows efficient use of resources when
making parallel requests for resources
– Files, external web services etc
Copyright © 2014 M/Gateway Developments Ltd
Asynchronous Syntax in Node.js
• Node.js is unique in that you have no
option but to use Asynchronous logic
Copyright © 2014 M/Gateway Developments Ltd
Node.js Popularity
• Launched in 2009
• Now hugely popular and continuing to
grow in popularity
– Server-side of web / mobile applications
• One reason is that just one language –
JavaScript – is needed for all parts of an
application
– Single skill-set
Copyright © 2014 M/Gateway Developments Ltd
Drawbacks of Node.js
• Even its greatest exponents will tell you
not to use Node.js for certain things
• In every other language, zealots will
encourage you to use it for everything!
Copyright © 2014 M/Gateway Developments Ltd
Drawbacks of Node.js
• Even its greatest exponents will tell you
not to use Node.js for certain things
– CPU-intensive logic
– Complex database manipulation
• Particularly relational database handling
Copyright © 2014 M/Gateway Developments Ltd
Drawbacks of Node.js
• Even its greatest exponents will tell you
not to use Node.js for certain things
– CPU-intensive logic
• Tie up the CPU and everyone else using the
process will be blocked
– Complex database manipulation
• Particularly relational database handling
Copyright © 2014 M/Gateway Developments Ltd
Drawbacks of Node.js
• Even its greatest exponents will tell you
not to use Node.js for certain things
– CPU-intensive logic
– Complex database manipulation
• Particularly relational database handling
– Due to the limitations of asynchronous logic, eg you can't
chain functions
Copyright © 2014 M/Gateway Developments Ltd
Usual Solutions
• Use a third-party queue to offload CPU-
intensive work to some other environment
– RabbitMQ
– ZeroMQ
• Use another language such as Rails for
database-intensive work
Copyright © 2014 M/Gateway Developments Ltd
The down-sides
• Heterogeneous environment
• Multiple skill-sets
• Multiple moving parts
Node.js
RabbitMQ
Rails
Java
Database
Copyright © 2014 M/Gateway Developments Ltd
The down-sides
• Heterogeneous environment
• Multiple skill-sets
• Multiple moving parts
Node.js
RabbitMQ
Rails
Java
DatabaseReminds you of EHMP?
Copyright © 2014 M/Gateway Developments Ltd
Cache/Mumps integration
• Ideally using synchronous logic
– Especially if you have to elegantly and easily
handle locking in legacy code
• Ideally abstract Cache/Mumps databases
in a way that makes intuitive sense to a
JavaScript developer
• Asynchronous logic for complex database
manipulation is painful, time-consuming
and difficult to understand/maintain
Copyright © 2014 M/Gateway Developments Ltd
Async is the New Sync?
• The Node.js community are well aware of
the need to avoid "callback hell" caused
by asychronous logic
• Next version of Node.js will support
Async/Await which greatly improves the
syntax
– Very like synchronous logic
Copyright © 2014 M/Gateway Developments Ltd
Async/Await Doesn't solve:
• Node.js concurrency
– Still need to avoid CPU-intensive code
• High-level database abstractions
– Proper chaining of functions requires
synchronous logic
Copyright © 2014 M/Gateway Developments Ltd
I want my Node.js Cake & Eat it
• I like JavaScript
• I want just one language for everything
– 1 skill set
– 1 set of moving parts
• No extra technologies, thank you
– Keep it simple
Copyright © 2014 M/Gateway Developments Ltd
The Problem is Concurrency
• All concurrent users in Node.js share the
same process
Copyright © 2014 M/Gateway Developments Ltd
The Problem is Concurrency
• All concurrent users in Node.js share the
same process
• As it happens, Amazon Web Services
accidentally created a solution
– And nobody (including AWS) seems to have
realised the consequences of what they've
done
Copyright © 2014 M/Gateway Developments Ltd
AWS Lambda
• "Function As A Service"
• AKA "Serverless"
Copyright © 2014 M/Gateway Developments Ltd
AWS Lambda
• "Function As A Service"
• AKA "Serverless"
• You upload functions
• AWS will execute them
– You don't worry about how or on what physical
machine(s)
• You pay per invocation of your function(s)
Copyright © 2014 M/Gateway Developments Ltd
AWS Lambda
• The first technology they supported was
Node.js
Copyright © 2014 M/Gateway Developments Ltd
AWS Concurrency?
• Your function will be invoked in a private
computation container of some sort
• Your function has that container all to itself
for the duration of its execution
• No competition with other concurrent
users
Copyright © 2014 M/Gateway Developments Ltd
Lambda Node.js Examples
• Examples show use of asynchronous APIs
• Node.js users of Lambda use
asynchronous APIs
• They're even excited about the possibility
of using Async/Await in Lambda
Copyright © 2014 M/Gateway Developments Ltd
Lambda Node.js Examples
• Examples show use of asynchronous APIs
• Node.js users of Lambda use
asynchronous APIs
• They're even excited about the possibility
of using Async/Await in Lambda
• But unless your Lambda function really
needs to be asynchronous, why use
asynchronous logic?
Copyright © 2014 M/Gateway Developments Ltd
Asynchronous Syntax in Other Languages?
• Available also in most other modern languages
– Java
– Python, etc
• Allows efficient use of resources when making
parallel requests for resources
– Files, external web services etc
• But no programmer in those languages
would use async logic if they didn't have to
Copyright © 2014 M/Gateway Developments Ltd
Async is the New Sync?
• Why would Node.js developers use
asynchronous logic in Lambda functions if
they don't have to?
– Partly dogma
Copyright © 2014 M/Gateway Developments Ltd
Async is the New Sync?
• Why would Node.js developers use
asynchronous logic in Lambda functions if
they don't have to?
– Partly dogma
– Partly because almost no synchronous APIs
exist, particularly for:
• Database integration
• Web/REST service access
Copyright © 2014 M/Gateway Developments Ltd
Such APIs are possible
Copyright © 2014 M/Gateway Developments Ltd
Such APIs are possible
Copyright © 2014 M/Gateway Developments Ltd
Any other way…
• To have your Node.js cake and eat it?
– Not everyone will want to use Lambda
• Would it be possible to create a locally-
available environment where my Node.js
code runs in an isolated container where
concurrency isn't an issue?
Copyright © 2014 M/Gateway Developments Ltd
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
qewd
ewd-qoper8-gtm
Cache/GT.M
ewd-document-store
Global
Storage
ewd-session
Express
HTTP(S)
Interface
Browser/RESTClient
Custom Worker
Module
ewd-qoper8
Constructed from a number of EWD 3 modules
Legacy
Code
WebSocket
Interface
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
qewd
ewd-qoper8-gtm
Cache/GT.M
ewd-document-store
Global
Storage
ewd-session
Koa.js
HTTP(S)
Interface
Browser/RESTClient
Custom Worker
Module
ewd-qoper8
Can also use Koa.js – next generation Web Server
Legacy
Code
WebSocket
Interface
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
qewd
ewd-qoper8-redis
Redis
ewd-document-store
Global
Storage
ewd-session
Koa.js
HTTP(S)
Interface
Browser/RESTClient
Custom Worker
Module
ewd-qoper8
Can even use Redis as if it was a Global Storage DB
WebSocket
Interface
Copyright © 2014 M/Gateway Developments Ltd
QEWD's Architecture
• Master Process
– Handles all incoming REST requests
• Via Express
• Queues and dispatches requests to worker
processes
• Worker Processes
– You define how large a pool of workers you
require
– Each worker handles just one request at a
time (unlike Node.js Cluster)
Copyright © 2014 M/Gateway Developments Ltd
Master Node.js Process
Queue
Queue
processor/
dispatcher
Incoming
Request
REST
HTTP
WebSocket
QEWD Architecture
Every incoming request
is passed from Express
and placed in a queue
No further processing
of requests occurs in
the master process
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Queue dispatcher is
invoked whenever a
request is added to
the queue
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Worker process
started if none
available
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
qewd-ripple
Handler module
Redis/Cache/GT.M
QEWD &
application-specific
Modules loaded
and connected to
database:
Redis,
Cache, GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Request passed
to worker
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Worker flagged as Unavailable
Node.js Worker Process
Custom
Worker
Module
Begin processing message
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Another incoming
request Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
If worker pool size not exceeded,
another worker is started
and request passed to it
Redis/Cache/GT.M
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
If entire Worker Pool is busy:
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
If entire Worker Pool is busy:
New
requests
remain
in queue
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
As soon as a worker is available again,
a queued message can be passed to it
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Available
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Finished
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
A user's handler function signals
completion using the function:
finished(responseObject);
This returns the response
object to the master
process
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Finished
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
And the response is
passed to Express which
returns it to the client
that sent the original request
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
The finished() function
also automatically returns
the worker process back
to the available pool
So it can now handle
the next queued request
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
Worker processes, once started,
are persistent
No start-up / tear-down cost
Workers will automatically close
themselves down if they are
inactive for more than a pre-set
threshold time period
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
Worker processes only handle
a single request at a time
Completely isolated run-time
environment for handler functions
No need for concerns about
Node.js concurrency, so
synchronous APIs can be used
Redis/Cache/GT.M
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
Redis/Cache/GT.M
Long-running or CPU-intensive
logic has no direct impact on
other worker processes
Copyright © 2014 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Node.js concurrency is handled
by the master process.
100% asynchronous logic
The master process does
almost nothing
No CPU-intensive or long-
running tasks, so very
high-performance
All the work happens in the
isolated worker processes
Multiple
Concurrent
Incoming
requests
Copyright © 2014 M/Gateway Developments Ltd
Performance?
• ewd-qoper8 module in isolation:
– Handles the queue/master/worker architecture
• Raspberry Pi 3 Model B
– 4 core CPU
– Readily-available commodity item
– Low-cost
• Easily-replicable benchmark
Copyright © 2014 M/Gateway Developments Ltd
Performance
• ewd-qoper8 benchmark script provided:
– How many workers? 3
– How many messages? 500,000
– Create a steady state of messages added to
the queue as they're being processed:
• Add a batch of 622 messages at a time
• Wait 100ms between each batch
– Messages are sent to workers which echo
them straight back
Copyright © 2014 M/Gateway Developments Ltd
Performance
• 5,800 messages/second sustained
throughput
• Limiting factor is master process hitting
100% CPU
• Workers only 30% CPU, so plenty of
capacity to do real work at this rate
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
• For the Java, Python or .Net developer
moving to Node.js, QEWD makes it a
much simpler, much less weird and scary
environment
– Asynchronous code only needed when
necessary for parallel execution:
• eg accessing multiple remote web services
• Quick and simple to install, configure and
deploy
Copyright © 2014 M/Gateway Developments Ltd
Unique features of QEWD.js
• Somewhat comparable to Apache
Tomcat:
– Application container
• Can host multiple applications from one
single instance of QEWD.js
– Can be a mixture of websocket, HTTP and
REST applications
Copyright © 2014 M/Gateway Developments Ltd
Unique features of QEWD.js
• High-level abstraction of
Redis/Cache/GT.M:
– Flexible Document Database
– Persistent JavaScript Objects
• Built-in very high-performance Session
database
– Using the above databases
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
• Front-to-back JSON
• Browser communicates via JSON
messages
– Ajax or Web-Sockets
• Even the integrated database is
abstracted as persistent JSON
– Cache, GT.M or Redis
– Identical APIs, so apps can be effortlessly
migrated between databases
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
• Looks after all the critically important parts
of a Web Application's back-end for you,
eg:
– Sessions
– Database cacheing
– Security
• Using tried and tested solutions
– Based on the previous-generation EWD
technology
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
• Resilient / Audit mode
– When enabled, permanent record kept in the
database of:
• Queued requests
• Processing status
• Response(s)
– If QEWD restarted, database is examined for queued,
unprocessed requests
• Automatically re-queued
– Can specify retention period of database records
Copyright © 2014 M/Gateway Developments Ltd
QEWD.js
• Supports all browser-side JavaScript
frameworks
• Some cool tooling and support available
for React
Copyright © 2014 M/Gateway Developments Ltd
Ripple-OSI
• Open Source project in UK & Ireland
– Open Source stack for healthcare
• Based on OpenEHR back-end systems
– Browser-based, REST-ful UI
• Orientated around the needs of clinicians
• Initiative led by Dr Tony Shannon
• Middle tier was originally Java-based
– Now entirely replaced using QEWD
• Choice of GT.M or Redis as embedded database
– Used for cacheing OpenEHR data
Copyright © 2014 M/Gateway Developments Ltd
Federated Access to OpenEHR
Browser QEWD
GT.M or
Redis
ewd-qoper8
queue
qewd-ripple
Module
Express
OpenEHR
Server
AQL over
HTTP(S)
Worker
PulseTile
UI
OpenEHR
Server
Copyright © 2014 M/Gateway Developments Ltd
Few Moving Parts
• Unlike EHMP, RippleOSI has almost no
other moving parts apart from Node.js and
QEWD.js
• Simple installer script
• Can even install and run on a Raspberry
Pi!
Copyright © 2014 M/Gateway Developments Ltd
Ripple Foundation
• http://ripple.foundation/
Copyright © 2014 M/Gateway Developments Ltd

Contenu connexe

Tendances

EWD 3 Training Course Part 4: Installing & Configuring QEWD
EWD 3 Training Course Part 4: Installing & Configuring QEWDEWD 3 Training Course Part 4: Installing & Configuring QEWD
EWD 3 Training Course Part 4: Installing & Configuring QEWDRob Tweed
 
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityEWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityRob Tweed
 
EWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewEWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewRob Tweed
 
EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts HereRob Tweed
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...Rob Tweed
 
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleEWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleRob Tweed
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceRob Tweed
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeRob Tweed
 
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesEWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesRob Tweed
 
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDEWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDRob Tweed
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationRob Tweed
 
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsEWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsRob Tweed
 
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDEWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDRob Tweed
 
EWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionEWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionRob Tweed
 
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSEWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSRob Tweed
 
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationRob Tweed
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingRob Tweed
 
EWD 3 Training Course Part 14: Using Ajax for QEWD Messages
EWD 3 Training Course Part 14: Using Ajax for QEWD MessagesEWD 3 Training Course Part 14: Using Ajax for QEWD Messages
EWD 3 Training Course Part 14: Using Ajax for QEWD MessagesRob Tweed
 
EWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceEWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceRob Tweed
 

Tendances (20)

EWD 3 Training Course Part 4: Installing & Configuring QEWD
EWD 3 Training Course Part 4: Installing & Configuring QEWDEWD 3 Training Course Part 4: Installing & Configuring QEWD
EWD 3 Training Course Part 4: Installing & Configuring QEWD
 
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityEWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
 
QEWD Update
QEWD UpdateQEWD Update
QEWD Update
 
EWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewEWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 Overview
 
EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts Here
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
 
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleEWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker Appliance
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient Mode
 
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesEWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
 
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDEWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
 
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsEWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIs
 
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDEWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
 
EWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionEWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD Session
 
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSEWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
 
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session Locking
 
EWD 3 Training Course Part 14: Using Ajax for QEWD Messages
EWD 3 Training Course Part 14: Using Ajax for QEWD MessagesEWD 3 Training Course Part 14: Using Ajax for QEWD Messages
EWD 3 Training Course Part 14: Using Ajax for QEWD Messages
 
EWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceEWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a Service
 

Similaire à QEWD.js: Have your Node.js Cake and Eat It Too

Brownbag on basics of node.js
Brownbag on basics of node.jsBrownbag on basics of node.js
Brownbag on basics of node.jsJason Park
 
The Positive and Negative Aspects of Node.js Web App Development.pdf
The Positive and Negative Aspects of Node.js Web App Development.pdfThe Positive and Negative Aspects of Node.js Web App Development.pdf
The Positive and Negative Aspects of Node.js Web App Development.pdfWDP Technologies
 
Node.js Web Development.pdf
Node.js Web Development.pdfNode.js Web Development.pdf
Node.js Web Development.pdfSonia Simi
 
Node.js Getting Started &amd Best Practices
Node.js Getting Started &amd Best PracticesNode.js Getting Started &amd Best Practices
Node.js Getting Started &amd Best Practicesbotsplash.com
 
Meetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech PeopleMeetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech PeopleIT Arena
 
PHP Vs NodeJS for Backend Web Development.pdf
PHP Vs NodeJS for Backend Web Development.pdfPHP Vs NodeJS for Backend Web Development.pdf
PHP Vs NodeJS for Backend Web Development.pdfSofiaCarter4
 
What's the "right" PHP Framework?
What's the "right" PHP Framework?What's the "right" PHP Framework?
What's the "right" PHP Framework?Barry Jones
 
Lessons learned from building Eclipse-based add-ons for commercial modeling t...
Lessons learned from building Eclipse-based add-ons for commercial modeling t...Lessons learned from building Eclipse-based add-ons for commercial modeling t...
Lessons learned from building Eclipse-based add-ons for commercial modeling t...IncQuery Labs
 
Isomorphic JavaScript with Node, WebPack, and React
Isomorphic JavaScript with Node, WebPack, and ReactIsomorphic JavaScript with Node, WebPack, and React
Isomorphic JavaScript with Node, WebPack, and ReactTyler Peterson
 
Neev Open Source Contributions
Neev Open Source ContributionsNeev Open Source Contributions
Neev Open Source ContributionsNeev Technologies
 
Gluecon 2014 - Bringing Node.js to the JVM
Gluecon 2014 - Bringing Node.js to the JVMGluecon 2014 - Bringing Node.js to the JVM
Gluecon 2014 - Bringing Node.js to the JVMJeremy Whitlock
 
After the LAMP, it's time to get MEAN
After the LAMP, it's time to get MEANAfter the LAMP, it's time to get MEAN
After the LAMP, it's time to get MEANJeff Fox
 
Bledar Gjocaj - Java open source
Bledar Gjocaj - Java open sourceBledar Gjocaj - Java open source
Bledar Gjocaj - Java open sourceOpen Labs Albania
 
Full stack development using javascript what and why - ajay chandravadiya
Full stack development using javascript   what and why - ajay chandravadiyaFull stack development using javascript   what and why - ajay chandravadiya
Full stack development using javascript what and why - ajay chandravadiyaajayrcgmail
 
Introduction to scaling your WordPress site past a single node using AWS
Introduction to scaling your WordPress site past a single node using AWSIntroduction to scaling your WordPress site past a single node using AWS
Introduction to scaling your WordPress site past a single node using AWSWP Engine
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLBarry Jones
 

Similaire à QEWD.js: Have your Node.js Cake and Eat It Too (20)

Brownbag on basics of node.js
Brownbag on basics of node.jsBrownbag on basics of node.js
Brownbag on basics of node.js
 
The Positive and Negative Aspects of Node.js Web App Development.pdf
The Positive and Negative Aspects of Node.js Web App Development.pdfThe Positive and Negative Aspects of Node.js Web App Development.pdf
The Positive and Negative Aspects of Node.js Web App Development.pdf
 
JavaCro'15 - Everything a Java EE Developer needs to know about the JavaScrip...
JavaCro'15 - Everything a Java EE Developer needs to know about the JavaScrip...JavaCro'15 - Everything a Java EE Developer needs to know about the JavaScrip...
JavaCro'15 - Everything a Java EE Developer needs to know about the JavaScrip...
 
NodeJS and what is actually does
NodeJS and what is actually doesNodeJS and what is actually does
NodeJS and what is actually does
 
Node.js Web Development.pdf
Node.js Web Development.pdfNode.js Web Development.pdf
Node.js Web Development.pdf
 
Node.js Getting Started &amd Best Practices
Node.js Getting Started &amd Best PracticesNode.js Getting Started &amd Best Practices
Node.js Getting Started &amd Best Practices
 
PHP vs JavaScript
PHP vs JavaScriptPHP vs JavaScript
PHP vs JavaScript
 
Meetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech PeopleMeetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech People
 
PHP Vs NodeJS for Backend Web Development.pdf
PHP Vs NodeJS for Backend Web Development.pdfPHP Vs NodeJS for Backend Web Development.pdf
PHP Vs NodeJS for Backend Web Development.pdf
 
What's the "right" PHP Framework?
What's the "right" PHP Framework?What's the "right" PHP Framework?
What's the "right" PHP Framework?
 
Lessons learned from building Eclipse-based add-ons for commercial modeling t...
Lessons learned from building Eclipse-based add-ons for commercial modeling t...Lessons learned from building Eclipse-based add-ons for commercial modeling t...
Lessons learned from building Eclipse-based add-ons for commercial modeling t...
 
Isomorphic JavaScript with Node, WebPack, and React
Isomorphic JavaScript with Node, WebPack, and ReactIsomorphic JavaScript with Node, WebPack, and React
Isomorphic JavaScript with Node, WebPack, and React
 
Neev Open Source Contributions
Neev Open Source ContributionsNeev Open Source Contributions
Neev Open Source Contributions
 
Gluecon 2014 - Bringing Node.js to the JVM
Gluecon 2014 - Bringing Node.js to the JVMGluecon 2014 - Bringing Node.js to the JVM
Gluecon 2014 - Bringing Node.js to the JVM
 
After the LAMP, it's time to get MEAN
After the LAMP, it's time to get MEANAfter the LAMP, it's time to get MEAN
After the LAMP, it's time to get MEAN
 
Dean4j@Njug5
Dean4j@Njug5Dean4j@Njug5
Dean4j@Njug5
 
Bledar Gjocaj - Java open source
Bledar Gjocaj - Java open sourceBledar Gjocaj - Java open source
Bledar Gjocaj - Java open source
 
Full stack development using javascript what and why - ajay chandravadiya
Full stack development using javascript   what and why - ajay chandravadiyaFull stack development using javascript   what and why - ajay chandravadiya
Full stack development using javascript what and why - ajay chandravadiya
 
Introduction to scaling your WordPress site past a single node using AWS
Introduction to scaling your WordPress site past a single node using AWSIntroduction to scaling your WordPress site past a single node using AWS
Introduction to scaling your WordPress site past a single node using AWS
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
 

Plus de Rob Tweed

EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesRob Tweed
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4Rob Tweed
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2Rob Tweed
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...Rob Tweed
 
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSEWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSRob Tweed
 
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesEWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesRob Tweed
 
EWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingEWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingRob Tweed
 
EWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesEWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesRob Tweed
 
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesEWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesRob Tweed
 
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsEWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsRob Tweed
 

Plus de Rob Tweed (12)

EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
 
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSEWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
 
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesEWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
 
EWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingEWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven Indexing
 
EWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesEWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database Capabilities
 
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesEWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
 
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsEWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
 

Dernier

Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....ShaimaaMohamedGalal
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 

Dernier (20)

Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 

QEWD.js: Have your Node.js Cake and Eat It Too

  • 1. Copyright © 2014 M/Gateway Developments Ltd QEWD.js Have Your Node.js Cake and Eat It Too Rob Tweed M/Gateway Developments Ltd Twitter: @rtweed http://www.mgateway.com
  • 2. Copyright © 2014 M/Gateway Developments Ltd
  • 3. Copyright © 2014 M/Gateway Developments Ltd QEWD.js • Just another Node.js framework? • What's wrong with the ones already available and used by thousands of developers? – Express.js – Koa – Meteor – Hapi – Sails, etc etc
  • 4. Copyright © 2014 M/Gateway Developments Ltd Two reasons • Achieving the best interface to Cache & GT.M from JavaScript – JavaScript as a first-class language and direct alternative to Cache ObjectScript / Mumps – Integrating with legacy Cache ObjectScript / Mumps code that was inherently synchronous
  • 5. Copyright © 2014 M/Gateway Developments Ltd Two reasons • Achieving the best interface to Cache & GT.M from JavaScript – JavaScript as a first-class language and direct alternative to Cache ObjectScript / Mumps – Integrating with legacy Cache ObjectScript / Mumps code that was inherently synchronous – I've been working with Node.js & Cache/Mumps since 2011 and have tried everything you can imagine to figure this out!
  • 6. Copyright © 2014 M/Gateway Developments Ltd Two reasons • Achieving the best interface to Cache & GT.M from JavaScript – JavaScript as a first-class language and direct alternative to Cache ObjectScript / Mumps – Integrating with legacy Cache ObjectScript / Mumps code that was inherently synchronous • Addressing some of the deficiencies in Node.js that are a direct consequence of its architecture
  • 7. Copyright © 2014 M/Gateway Developments Ltd Node.js Architecture • Everything executes in a single process – You might have 1000's of users doing stuff concurrently • They're all sharing the same process!
  • 8. Copyright © 2014 M/Gateway Developments Ltd By Design • Ryan Dahl, the inventor of Node.js, wanted to create a highly-scalable, high- performance architecture for network programs – Web servers – Chat servers • Showed that the threaded architecture of Apache had performance limits and heavy memory usage
  • 9. Copyright © 2014 M/Gateway Developments Ltd Node.js Architecture • Everything executes in a single process • Non-blocking I/O – No user activity must block the process, or everyone grinds to a halt • Event-driven, asynchronous logic – Fire off the request, but don't wait for the results • Carry on with the next task – When results come back, handle them at the next opportunity
  • 10. Copyright © 2014 M/Gateway Developments Ltd Node.js = server-side JavaScript • Ryan Dahl wasn't actually a big JavaScript fan • However, he realised that it was a convenient language for such an environment, as it's designed for exactly the same kind of way of working in the browser • Google's V8 JavaScript engine was Open Sourced, so he used it to provide the language for Node.js – (which is actually mostly written in C++)
  • 11. Copyright © 2014 M/Gateway Developments Ltd Asynchronous Syntax in Other Languages? • Node.js isn't unique in supporting asynchronous logic and non-blocking I/O • Available also in most other modern languages – Java – Python, etc • Allows efficient use of resources when making parallel requests for resources – Files, external web services etc
  • 12. Copyright © 2014 M/Gateway Developments Ltd Asynchronous Syntax in Node.js • Node.js is unique in that you have no option but to use Asynchronous logic
  • 13. Copyright © 2014 M/Gateway Developments Ltd Node.js Popularity • Launched in 2009 • Now hugely popular and continuing to grow in popularity – Server-side of web / mobile applications • One reason is that just one language – JavaScript – is needed for all parts of an application – Single skill-set
  • 14. Copyright © 2014 M/Gateway Developments Ltd Drawbacks of Node.js • Even its greatest exponents will tell you not to use Node.js for certain things • In every other language, zealots will encourage you to use it for everything!
  • 15. Copyright © 2014 M/Gateway Developments Ltd Drawbacks of Node.js • Even its greatest exponents will tell you not to use Node.js for certain things – CPU-intensive logic – Complex database manipulation • Particularly relational database handling
  • 16. Copyright © 2014 M/Gateway Developments Ltd Drawbacks of Node.js • Even its greatest exponents will tell you not to use Node.js for certain things – CPU-intensive logic • Tie up the CPU and everyone else using the process will be blocked – Complex database manipulation • Particularly relational database handling
  • 17. Copyright © 2014 M/Gateway Developments Ltd Drawbacks of Node.js • Even its greatest exponents will tell you not to use Node.js for certain things – CPU-intensive logic – Complex database manipulation • Particularly relational database handling – Due to the limitations of asynchronous logic, eg you can't chain functions
  • 18. Copyright © 2014 M/Gateway Developments Ltd Usual Solutions • Use a third-party queue to offload CPU- intensive work to some other environment – RabbitMQ – ZeroMQ • Use another language such as Rails for database-intensive work
  • 19. Copyright © 2014 M/Gateway Developments Ltd The down-sides • Heterogeneous environment • Multiple skill-sets • Multiple moving parts Node.js RabbitMQ Rails Java Database
  • 20. Copyright © 2014 M/Gateway Developments Ltd The down-sides • Heterogeneous environment • Multiple skill-sets • Multiple moving parts Node.js RabbitMQ Rails Java DatabaseReminds you of EHMP?
  • 21. Copyright © 2014 M/Gateway Developments Ltd Cache/Mumps integration • Ideally using synchronous logic – Especially if you have to elegantly and easily handle locking in legacy code • Ideally abstract Cache/Mumps databases in a way that makes intuitive sense to a JavaScript developer • Asynchronous logic for complex database manipulation is painful, time-consuming and difficult to understand/maintain
  • 22. Copyright © 2014 M/Gateway Developments Ltd Async is the New Sync? • The Node.js community are well aware of the need to avoid "callback hell" caused by asychronous logic • Next version of Node.js will support Async/Await which greatly improves the syntax – Very like synchronous logic
  • 23. Copyright © 2014 M/Gateway Developments Ltd Async/Await Doesn't solve: • Node.js concurrency – Still need to avoid CPU-intensive code • High-level database abstractions – Proper chaining of functions requires synchronous logic
  • 24. Copyright © 2014 M/Gateway Developments Ltd I want my Node.js Cake & Eat it • I like JavaScript • I want just one language for everything – 1 skill set – 1 set of moving parts • No extra technologies, thank you – Keep it simple
  • 25. Copyright © 2014 M/Gateway Developments Ltd The Problem is Concurrency • All concurrent users in Node.js share the same process
  • 26. Copyright © 2014 M/Gateway Developments Ltd The Problem is Concurrency • All concurrent users in Node.js share the same process • As it happens, Amazon Web Services accidentally created a solution – And nobody (including AWS) seems to have realised the consequences of what they've done
  • 27. Copyright © 2014 M/Gateway Developments Ltd AWS Lambda • "Function As A Service" • AKA "Serverless"
  • 28. Copyright © 2014 M/Gateway Developments Ltd AWS Lambda • "Function As A Service" • AKA "Serverless" • You upload functions • AWS will execute them – You don't worry about how or on what physical machine(s) • You pay per invocation of your function(s)
  • 29. Copyright © 2014 M/Gateway Developments Ltd AWS Lambda • The first technology they supported was Node.js
  • 30. Copyright © 2014 M/Gateway Developments Ltd AWS Concurrency? • Your function will be invoked in a private computation container of some sort • Your function has that container all to itself for the duration of its execution • No competition with other concurrent users
  • 31. Copyright © 2014 M/Gateway Developments Ltd Lambda Node.js Examples • Examples show use of asynchronous APIs • Node.js users of Lambda use asynchronous APIs • They're even excited about the possibility of using Async/Await in Lambda
  • 32. Copyright © 2014 M/Gateway Developments Ltd Lambda Node.js Examples • Examples show use of asynchronous APIs • Node.js users of Lambda use asynchronous APIs • They're even excited about the possibility of using Async/Await in Lambda • But unless your Lambda function really needs to be asynchronous, why use asynchronous logic?
  • 33. Copyright © 2014 M/Gateway Developments Ltd Asynchronous Syntax in Other Languages? • Available also in most other modern languages – Java – Python, etc • Allows efficient use of resources when making parallel requests for resources – Files, external web services etc • But no programmer in those languages would use async logic if they didn't have to
  • 34. Copyright © 2014 M/Gateway Developments Ltd Async is the New Sync? • Why would Node.js developers use asynchronous logic in Lambda functions if they don't have to? – Partly dogma
  • 35. Copyright © 2014 M/Gateway Developments Ltd Async is the New Sync? • Why would Node.js developers use asynchronous logic in Lambda functions if they don't have to? – Partly dogma – Partly because almost no synchronous APIs exist, particularly for: • Database integration • Web/REST service access
  • 36. Copyright © 2014 M/Gateway Developments Ltd Such APIs are possible
  • 37. Copyright © 2014 M/Gateway Developments Ltd Such APIs are possible
  • 38. Copyright © 2014 M/Gateway Developments Ltd Any other way… • To have your Node.js cake and eat it? – Not everyone will want to use Lambda • Would it be possible to create a locally- available environment where my Node.js code runs in an isolated container where concurrency isn't an issue?
  • 39. Copyright © 2014 M/Gateway Developments Ltd
  • 40. Copyright © 2014 M/Gateway Developments Ltd QEWD.js Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher qewd ewd-qoper8-gtm Cache/GT.M ewd-document-store Global Storage ewd-session Express HTTP(S) Interface Browser/RESTClient Custom Worker Module ewd-qoper8 Constructed from a number of EWD 3 modules Legacy Code WebSocket Interface
  • 41. Copyright © 2014 M/Gateway Developments Ltd QEWD.js Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher qewd ewd-qoper8-gtm Cache/GT.M ewd-document-store Global Storage ewd-session Koa.js HTTP(S) Interface Browser/RESTClient Custom Worker Module ewd-qoper8 Can also use Koa.js – next generation Web Server Legacy Code WebSocket Interface
  • 42. Copyright © 2014 M/Gateway Developments Ltd QEWD.js Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher qewd ewd-qoper8-redis Redis ewd-document-store Global Storage ewd-session Koa.js HTTP(S) Interface Browser/RESTClient Custom Worker Module ewd-qoper8 Can even use Redis as if it was a Global Storage DB WebSocket Interface
  • 43. Copyright © 2014 M/Gateway Developments Ltd QEWD's Architecture • Master Process – Handles all incoming REST requests • Via Express • Queues and dispatches requests to worker processes • Worker Processes – You define how large a pool of workers you require – Each worker handles just one request at a time (unlike Node.js Cluster)
  • 44. Copyright © 2014 M/Gateway Developments Ltd Master Node.js Process Queue Queue processor/ dispatcher Incoming Request REST HTTP WebSocket QEWD Architecture Every incoming request is passed from Express and placed in a queue No further processing of requests occurs in the master process
  • 45. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Queue dispatcher is invoked whenever a request is added to the queue
  • 46. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Worker process started if none available
  • 47. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher qewd-ripple Handler module Redis/Cache/GT.M QEWD & application-specific Modules loaded and connected to database: Redis, Cache, GT.M
  • 48. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Node.js Worker Process Custom Worker Module Request passed to worker Redis/Cache/GT.M
  • 49. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Worker flagged as Unavailable Node.js Worker Process Custom Worker Module Begin processing message Redis/Cache/GT.M
  • 50. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Another incoming request Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M
  • 51. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module If worker pool size not exceeded, another worker is started and request passed to it Redis/Cache/GT.M Redis/Cache/GT.M
  • 52. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M If entire Worker Pool is busy: Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M
  • 53. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher If entire Worker Pool is busy: New requests remain in queue Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M
  • 54. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M As soon as a worker is available again, a queued message can be passed to it Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M Available Node.js Worker Process Custom Worker Module Redis/Cache/GT.M
  • 55. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Finished Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/Cache/GT.M A user's handler function signals completion using the function: finished(responseObject); This returns the response object to the master process
  • 56. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Finished Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module And the response is passed to Express which returns it to the client that sent the original request Redis/Cache/GT.M
  • 57. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module The finished() function also automatically returns the worker process back to the available pool So it can now handle the next queued request Redis/Cache/GT.M
  • 58. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module Worker processes, once started, are persistent No start-up / tear-down cost Workers will automatically close themselves down if they are inactive for more than a pre-set threshold time period Redis/Cache/GT.M
  • 59. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module Worker processes only handle a single request at a time Completely isolated run-time environment for handler functions No need for concerns about Node.js concurrency, so synchronous APIs can be used Redis/Cache/GT.M
  • 60. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module Redis/Cache/GT.M Long-running or CPU-intensive logic has no direct impact on other worker processes
  • 61. Copyright © 2014 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Node.js concurrency is handled by the master process. 100% asynchronous logic The master process does almost nothing No CPU-intensive or long- running tasks, so very high-performance All the work happens in the isolated worker processes Multiple Concurrent Incoming requests
  • 62. Copyright © 2014 M/Gateway Developments Ltd Performance? • ewd-qoper8 module in isolation: – Handles the queue/master/worker architecture • Raspberry Pi 3 Model B – 4 core CPU – Readily-available commodity item – Low-cost • Easily-replicable benchmark
  • 63. Copyright © 2014 M/Gateway Developments Ltd Performance • ewd-qoper8 benchmark script provided: – How many workers? 3 – How many messages? 500,000 – Create a steady state of messages added to the queue as they're being processed: • Add a batch of 622 messages at a time • Wait 100ms between each batch – Messages are sent to workers which echo them straight back
  • 64. Copyright © 2014 M/Gateway Developments Ltd Performance • 5,800 messages/second sustained throughput • Limiting factor is master process hitting 100% CPU • Workers only 30% CPU, so plenty of capacity to do real work at this rate
  • 65. Copyright © 2014 M/Gateway Developments Ltd QEWD.js • For the Java, Python or .Net developer moving to Node.js, QEWD makes it a much simpler, much less weird and scary environment – Asynchronous code only needed when necessary for parallel execution: • eg accessing multiple remote web services • Quick and simple to install, configure and deploy
  • 66. Copyright © 2014 M/Gateway Developments Ltd Unique features of QEWD.js • Somewhat comparable to Apache Tomcat: – Application container • Can host multiple applications from one single instance of QEWD.js – Can be a mixture of websocket, HTTP and REST applications
  • 67. Copyright © 2014 M/Gateway Developments Ltd Unique features of QEWD.js • High-level abstraction of Redis/Cache/GT.M: – Flexible Document Database – Persistent JavaScript Objects • Built-in very high-performance Session database – Using the above databases
  • 68. Copyright © 2014 M/Gateway Developments Ltd QEWD.js • Front-to-back JSON • Browser communicates via JSON messages – Ajax or Web-Sockets • Even the integrated database is abstracted as persistent JSON – Cache, GT.M or Redis – Identical APIs, so apps can be effortlessly migrated between databases
  • 69. Copyright © 2014 M/Gateway Developments Ltd QEWD.js • Looks after all the critically important parts of a Web Application's back-end for you, eg: – Sessions – Database cacheing – Security • Using tried and tested solutions – Based on the previous-generation EWD technology
  • 70. Copyright © 2014 M/Gateway Developments Ltd QEWD.js • Resilient / Audit mode – When enabled, permanent record kept in the database of: • Queued requests • Processing status • Response(s) – If QEWD restarted, database is examined for queued, unprocessed requests • Automatically re-queued – Can specify retention period of database records
  • 71. Copyright © 2014 M/Gateway Developments Ltd QEWD.js • Supports all browser-side JavaScript frameworks • Some cool tooling and support available for React
  • 72. Copyright © 2014 M/Gateway Developments Ltd Ripple-OSI • Open Source project in UK & Ireland – Open Source stack for healthcare • Based on OpenEHR back-end systems – Browser-based, REST-ful UI • Orientated around the needs of clinicians • Initiative led by Dr Tony Shannon • Middle tier was originally Java-based – Now entirely replaced using QEWD • Choice of GT.M or Redis as embedded database – Used for cacheing OpenEHR data
  • 73. Copyright © 2014 M/Gateway Developments Ltd Federated Access to OpenEHR Browser QEWD GT.M or Redis ewd-qoper8 queue qewd-ripple Module Express OpenEHR Server AQL over HTTP(S) Worker PulseTile UI OpenEHR Server
  • 74. Copyright © 2014 M/Gateway Developments Ltd Few Moving Parts • Unlike EHMP, RippleOSI has almost no other moving parts apart from Node.js and QEWD.js • Simple installer script • Can even install and run on a Raspberry Pi!
  • 75. Copyright © 2014 M/Gateway Developments Ltd Ripple Foundation • http://ripple.foundation/
  • 76. Copyright © 2014 M/Gateway Developments Ltd