SlideShare a Scribd company logo
Copyright © 2016 M/Gateway Developments Ltd
EWD 3 Training Course
Part 2
Overview of EWD 3
Rob Tweed
Director, M/Gateway Developments Ltd
Twitter: @rtweed
Copyright © 2016 M/Gateway Developments Ltd
EWD 3 Design Aims
• Modularising previous-generation (EWD.js) into
independent components
• Mix and match "buffet" of components
• Interoperable with other Node.js modules, eg Express
• No core dependence on particular
databases
• Redis, Caché and GT.M can be used as embedded multi-
model databases
• But any other Node.js-interfaced database can be used too
Copyright © 2016 M/Gateway Developments Ltd
Core EWD 3 Component
• ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
• Very high-performance Node.js Message
Queue
• Master Node.js process:
• Queue & dispatch mechanism
• Pool of persistent Worker Node.js
processes
• These process the requests that are put on the queue
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
• Creates an isolated run-time environment
for each handler function
• Each worker process only handles a single request
at a time
• Comparable to AWS Lambda's run-time container
• Concurrency is handled by the master
process only
• Its sole purpose is to queue and dispatch incoming
requests to an available worker process, and
handle the response/results from the worker
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
• Worker processes are persistent
– Started on demand
– When a worker process finishes processing a
request, it is returned to the available pool,
ready to process another request
– No startup / tear-down cost
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
• Master process API
– this.addToQueue(messageObject)
• Adds a message to the queue
– this.on('response', function(responseObject, workerPid) {..}
• Handles the response from worker
– Usually simply returning the response to the client that
sent the original request message to the master process
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
• What the worker does to process a
message is up to you
• You define a custom worker module
• Worker API:
– this.on('message', function(messageObject, send, finished) {..}
• finished(responseObject):
– Mandatory function
– Sends final response to master process
– Releases Worker process back to available pool
• send(responseObject):
– Optional function
– Sends a response to master process
– Worker process remains unavailable
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Node.js Worker Process
Node.js Worker Process
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
addToQueue(obj)
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Unavailable
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Begin processing message
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Unavailable
worker.on('message', function(messageObj) {
// process message
});
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Begin processing message
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
addToQueue(obj)
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
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
ewd-qoper8
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Worker pool size not exceeded:
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Worker pool all busy:
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
New
request
remains
in queue
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
As soon as a worker is available again:
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Available
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Worker pool all busy:
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
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
ewd-qoper8
finished(responseObject);
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Finished
this.on('response', function(responseObj) {
// do something with the response
});
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Worker automatically returned
to the available pool
NB: Workers are NOT destroyed
after use
Removes overhead of
continually starting worker
processes
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Worker processes only handle
a single request at a time
Completely isolated run-time
environment for your handler functions
Worker process becomes immediately
available for the next queued request
when processing completed
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 is a building block
• Not really useful on its own
• Completely generic, general-purpose
message queue
• Core piece of infrastructure on which the
rest of EWD 3 is built
– ewd-qoper8 can also be used independently
of the other EWD 3 modules and integrated
with any other Node.js modules, databases
etc
Copyright © 2016 M/Gateway Developments Ltd
Express + ewd-qoper8
• Express is the standard Node.js web server
– REST, Web Services, interactive applications
– Express is a Node.js module
– Customised by defining middleware
– ewd-qoper8 can be configured as Express
middleware
• Requests sent to Express by client
• Routed to ewd-qoper8
• ewd-qoper8 queues and processes them
• ewd-qoper8 response returned via Express to client
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + Express
Queue
Queue
processor/
dispatcher
Express
HTTP(S)
Interface
WebSocket
socket.io
Interface
addToQueue(req)
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + Express
+ ewd-qoper8-express
Queue
Queue
processor/
dispatcher
Express
HTTP(S)
Interface
Automates and simplifies the use of
ewd-qoper8 with Express for HTTP
requests
Adds special Express router function
app.use('/qoper8', qx.router());
ewd-qoper8-express ewd-qoper8-
express
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + Express
+ ewd-qoper8-express
Queue
Queue
processor/
dispatcher
Express
HTTP(S)
Interface
Message constructed from Express
req object – all information needed
for back-end processing by Worker:
-path
-method
-headers
-query
-body
-etc
ewd-qoper8-express ewd-qoper8-
express
Node.js Worker Process
Custom
Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 Database Dependency?
• ewd-qoper8 itself does not have a
dependency on a database
– In-memory queue
– Master and Workers are just Node.js
processes
* see later parts of this course for details on how to add queue backup / resilience
Copyright © 2016 M/Gateway Developments Ltd
Using ewd-qoper8 with Caché
• Use a separate module:
– ewd-qoper8-cache
• Normally used by worker processes
• Makes use of cache.node interface module
– cache.node is a proprietary InterSystems module that is
included with Caché
– Allows access from JavaScript/Node.js to:
» Caché extrinsic functions
» Global storage
» Caché Objects & methods
– JavaScript API defined by InterSystems
» Low-level
Copyright © 2016 M/Gateway Developments Ltd
Using ewd-qoper8 with GT.M
• Use a separate module:
– ewd-qoper8-gtm
• Normally used by worker processes
• Makes use of NodeM interface module
– NodeM is an Open Source module for use with GT.M,
which implements the cache.node APIs
– Allows access from JavaScript/Node.js to:
» GT.M extrinsic functions
» Global storage
– JavaScript API originally defined by InterSystems
» Low-level
Copyright © 2016 M/Gateway Developments Ltd
Using ewd-qoper8 with Redis
• Use a separate module:
– ewd-qoper8-redis
• Normally used by worker processes
• Makes use of ewd-redis-globals module
– ewd-redis-globals is an Open Source module for use with
Redis, which:
» Implements Global Storage functionality
» implements the cache.node APIs
– Allows access from JavaScript/Node.js to:
» Global storage
» Uses the tcp-netx module to connect to Redis
– JavaScript API originally defined by InterSystems
» Low-level
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom Worker
Module
cache.node
ewd-qoper8-cache
Caché
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-gtm
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom Worker
Module
nodem
ewd-qoper8-gtm
GT.M
ewd-qoper8
Equivalent module for use with GT.M
Uses David Wicksell’s NodeM module
which emulates cache.node for GT.M
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-redis
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom Worker
Module
tcp-netx
ewd-qoper8-redis
Redis
ewd-qoper8
Equivalent module for use with Redis
Redis behaves as a Global Storage
Database via the same cache.node APIs
ewd-redis-globals
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
function
Custom Worker
Module
ewd-qoper8
For legacy Mumps or
Caché ObjectScript
Function integration
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-gtm
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
nodem
ewd-qoper8-gtm
GT.M
function
Custom Worker
Module
ewd-qoper8
For legacy Mumps
Function integration
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
Globals
Custom Worker
Module
ewd-qoper8
Basic low-level
Mumps-centric
API
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-gtm
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
nodem
ewd-qoper8-gtm
GT.M
Globals
Custom Worker
Module
ewd-qoper8
Basic low-level
Mumps-centric
API
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-redis
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom Worker
Module
tcp-netx
ewd-qoper8-redis
Redis
ewd-qoper8
ewd-redis-globals
Globals
Basic low-level
API
Copyright © 2016 M/Gateway Developments Ltd
JavaScript-centric database access
• ewd-qoper8-cache, ewd-qoper8-gtm and
ewd-qoper8-redis auto-install ewd-
document-store
• ewd-document-store provides a
JavaScript-oriented abstraction of Global
Storage database:
– "persistent JavaScript Objects"
– Document database
• Fine-grained storage of JSON
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
+ ewd-document-store
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Custom Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
+ ewd-document-store
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
Persistent JavaScript Objects
&
Fine-grained Document Database
Custom Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-gtm
+ ewd-document-store
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
nodem
ewd-qoper8-gtm
GT.M
ewd-document-store
Globals
Persistent JavaScript Objects
&
Fine-grained Document Database
Custom Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-redis
+ ewd-document-store
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom Worker
Module
tcp-netx
Redis
ewd-qoper8
ewd-redis-globals
Globals
ewd-qoper8-gtm ewd-document-store
Persistent JavaScript Objects
&
Fine-grained Document Database
Copyright © 2016 M/Gateway Developments Ltd
ewd-document-store
myDocument
“a” 123
“b”
“c2” “foo2”
“d”
“c1” “foo”
“e2”
“e1”
“f2” “bar2”
“f1” “bar1”
“f2” “bar2”
“f1” “bar1”
“f3” “bar3”
myDocument = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
e1: {
f1: 'bar1',
f2: 'bar2'
},
e2: {
f1: 'bar1',
f2: 'bar2',
f3: 'bar3'
}
}
}
Copyright © 2016 M/Gateway Developments Ltd
ewd-document-store
myDocument
“a” 123
“b”
“c2” “foo2”
“d”
“c1” “foo”
“e2”
“e1”
“f2” “bar2”
“f1” “bar1”
“f2” “bar2”
“f1” “bar1”
“f3” “bar3”
var f3node = new this.documentStore.DocumentNode('myDocument', ['d', 'e2', 'f3']);
Copyright © 2016 M/Gateway Developments Ltd
ewd-document-store
myDocument
“a” 123
“b”
“c2” “foo2”
“d”
“c1” “foo”
“e2”
“e1”
“f2” “bar2”
“f1” “bar1”
“f2” “bar2”
“f1” “bar1”
“f3” “bar3”
var value = f3Node.value; // 'bar3'
Copyright © 2016 M/Gateway Developments Ltd
ewd-document-store
myDocument
“a” 123
“b”
“c2” “foo2”
“d”
“c1” “foo”
“e2”
“e1”
“f2” “bar2”
“f1” “bar1”
“f2” “bar2”
“f1” “bar1”
“f3” “bar3”
var value = f3Node.parent.$('f2').value; // 'bar2'
Copyright © 2016 M/Gateway Developments Ltd
ewd-document-store
myDocument
“a” 123
“b”
“c2” “foo2”
“d”
“c1” “foo”
“e2”
“e1”
“f2” “bar2”
“f1” “bar1”
“f2” “bar2”
“f1” “bar1”
“f3” “bar3”
myDocument = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
e1: {
f1: 'bar1',
f2: 'bar2'
},
e2: {
f1: 'bar1',
f2: 'bar2',
f3: 'bar3'
}
}
}
var docOnDisk = new this.documentStore.DocumentNode('myDocument');
var localDoc = docOnDisk.getDocument();
Copyright © 2016 M/Gateway Developments Ltd
ewd-document-store
myDocument
“a” 123
“b”
“c2” “foo2”
“d”
“c1” “foo”
“e2”
“e1”
“f2” “bar2”
“f1” “bar1”
“f2” “bar2”
“f1” “bar1”
“f3” “bar3”
myDocument = {
a: 123,
b: {
c1: 'foo',
c2: 'foo2'
}
d: {
e1: {
f1: 'bar1',
f2: 'bar2'
},
e2: {
f1: 'bar1',
f2: 'bar2',
f3: 'bar3'
}
}
}
var docOnDisk = new this.documentStore.DocumentNode('myDocument');
docOnDisk.setDocument(localDoc);
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
+ ewd-document-store
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
This powerful & intuitive abstraction
requires synchronous access
ewd-qoper8 provides the isolated
run-time container to make this possible
Custom Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-gtm
+ ewd-document-store
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
nodem
ewd-qoper8-gtm
GT.M
ewd-document-store
Globals
Custom Worker
Module
ewd-qoper8
This powerful & intuitive abstraction
requires synchronous access
ewd-qoper8 provides the isolated
run-time container to make this possible
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-redis
+ ewd-document-store
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom Worker
Module
tcp-netx
Redis
ewd-qoper8
ewd-redis-globals
Globals
ewd-qoper8-gtm ewd-document-store
This powerful & intuitive abstraction
requires synchronous access
ewd-qoper8 provides the isolated
run-time container to make this possible
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 for synchronous
database access
• A worker process only handles one
request object at a time
• Any blocking database (or other) I/O has
no impact on the processing of other
requests
– Each request independently handled, isolated
in its own worker
Copyright © 2016 M/Gateway Developments Ltd
Sessions
• EWD 3 uses a stateless model for web access
• Each request from a client may be processed by
a different ewd-qoper8 worker process
• Usually you need to maintain state information
across a sequence of client requests
• EWD Sessions provide this capability
• The ewd-session module allows you to create
and maintain Sessions
– Sessions are automatically mapped to ewd-document
DocumentNode objects
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
+ ewd-document-store + ewd-session
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
ewd-session
Session storage projected as DocumentNode objects
Custom Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-gtm
+ ewd-document-store + ewd-session
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
nodem
ewd-qoper8-gtm
GT.M
ewd-document-store
Globals
ewd-session
Session storage projected as DocumentNode objects
Custom Worker
Module
ewd-qoper8
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-redis
+ ewd-document-store + ewd-session
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom Worker
Module
tcp-netx
Redis
ewd-qoper8
ewd-redis-globals
Globals
ewd-qoper8-gtm ewd-document-store
ewd-session
Session storage projected as DocumentNode objects
Copyright © 2016 M/Gateway Developments Ltd
ewd-session APIs
• sessions.create(applicationName)
– Creates a new session, associated with the
specified application
– Returns a session token
• Randomly-generated uuid string
• sessions.authenticate(token)
– Checks that token is valid and has not yet
expired
– returns the session object for the token, or an
error
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache*+
ewd-document-store + ewd-session
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
ewd-session
var session = sessions.create('vista');
Send back session.token
Custom Worker
Module
ewd-qoper8
* Applies also to ewd-qoper8-gtm and ewd-qoper8-redis
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache*
+ ewd-document-store + ewd-session
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
ewd-session
var result = sessions.authenticate(token);
Returns result.session if successful / result.error if not
Custom Worker
Module
ewd-qoper8
* Applies also to ewd-qoper8-gtm and ewd-qoper8-redis
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache*
+ ewd-document-store + ewd-session
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
ewd-session
Session object extends GlobalNode object
Adds session-specific properties & methods
Custom Worker
Module
ewd-qoper8
* Applies also to ewd-qoper8-gtm and ewd-qoper8-redis
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8 + ewd-qoper8-cache
+ ewd-document-store + ewd-session
+ Express
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
ewd-session
Express
HTTP(S)
Interface
WebSocket
socket.io
Interface
Custom Worker
Module
ewd-qoper8
Functions
Copyright © 2016 M/Gateway Developments Ltd
Pre-packaged super-modules
• QEWD (formally known as ewd-xpress)
– Quick and Easy Web Development platform for:
• Interactive browser-based applications
– Web-sockets or Ajax
• Web and REST services
• Embedded persistent JSON store / session cache using:
– Caché, GT.M or Redis
• Compatible with all modern JavaScript front-end frameworks
• ewd-qoper8-vistarpc
– REST interface to VistA RPCs
• ewd-feder8
– Federation / integration platform
• Extension of QEWD
– Lightweight enterprise service bus functionality
Copyright © 2016 M/Gateway Developments Ltd
QEWD (using Caché)
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
ewd-xpress
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
ewd-session
Express
HTTP(S)
Interface
WebSocket
socket.io
Interface
browserewd-client
Custom Worker
Module
ewd-qoper8
Functions
Copyright © 2016 M/Gateway Developments Ltd
QEWD (using GT.M)
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
ewd-xpress
nodem
ewd-qoper8-gtm
GT.M
ewd-document-store
Globals
ewd-session
Express
HTTP(S)
Interface
WebSocket
socket.io
Interface
browserewd-client
Custom Worker
Module
ewd-qoper8
Functions
Copyright © 2016 M/Gateway Developments Ltd
QEWD (using Redis)
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
ewd-xpress
ewd-redis-globals
ewd-qoper8-redis
Redis
ewd-document-store
Globals
ewd-session
Express
HTTP(S)
Interface
WebSocket
socket.io
Interface
browserewd-client
Custom Worker
Module
ewd-qoper8
tcp-netx
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8-vistarpc (using Caché)
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
ewd-qoper8-
vistarpc
cache.node
ewd-qoper8-cache ewd-document-store
Globals
ewd-session
Express
HTTP(S)
Interface
REST
RPCs
Interface
function
Caché & VistA
Symbol
Table
Custom Worker
Module
ewd-qoper8
Symbol Table
Function
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8-vistarpc (using GT.M)
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
ewd-qoper8-
vistarpc
nodem
ewd-qoper8-gtm ewd-document-store
Globals
ewd-session
Express
HTTP(S)
Interface
REST
RPCs
Interface
function
GT.M & VistA
Symbol
Table
Custom Worker
Module
ewd-qoper8
Symbol Table
Function
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8-vistarpc
• Login: (POST)
– Access & verify codes
– XUS SIGNON SETUP
– XUS AV CODE
– Returns error or greeting object
– If successful:
• Creates new Session
• Symbol table saved to Session
– Contains DUZ etc
– No direct access by REST client
– Only Indirect access via Authorization token
• Return Session Token & VistA greeting
20 – 30ms round trip
Copyright © 2016 M/Gateway Developments Ltd
ewd-qoper8-vistarpc
• If logged in - runRPC:
– Use Session token in Authorization header
– POST:
• RPC name
• RPC arguments object
– Symbol table restored from Session
• Contains DUZ etc
• Determines whether user can run RPC
– Standard Mumps-side "business as usual" logic
– Return RPC result
– Save Symbol table to Session
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
ewd-feder8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
Globals
ewd-session
Express
HTTP(S)
Interface
Custom Worker
Module
ewd-qoper8
REST/
Web
Service
Client
ewd-xpress
Also works with GT.M and Redis
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Master Process
Express
REST/
Web
Service
Client
Worker Process ewd-feder8
ewd-qoper8
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Master Process
Express
REST/
Web
Service
Client
Worker Process ewd-feder8
ewd-qoper8
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Named
Group
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Copy of request
sent to all servers
in group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Responses
Received
asynchronously
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Last response
Received
Aggregate response
object created
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8
Master Process
Express
REST/
Web
Service
Client
Worker Process ewd-feder8
Custom Worker
Module
ewd-qoper8
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Named
Group
Aggregate response
Returned to client via
Master process
Copyright © 2016 M/Gateway Developments Ltd
Aggregate response
{
Server_1_name: {responseObject},
Server_2_name: {errorObject},
Server_3_name: {responseObject}
}
Copyright © 2016 M/Gateway Developments Ltd
Interception / Customisation
• ewd-feder8 emits events:
– When it receives a request from a client
– When it receives a response from an end-
point server
– When an aggregate response is ready for
return to a client
• These can be used to:
– Intercept the flow through ewd-feder8; and
– Customise the behaviour of ewd-feder8
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Intercept response
Possibly modify it
And/or determine
action based on
response
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Forward new request
to group of servers
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Intercept aggregate
Response
Decide what to do
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Send new request
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Intercept response
Create final response
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Return final
response to
client
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
Cache can be
Used to store/
build up final
response during
"dance"
Copyright © 2016 M/Gateway Developments Ltd
ewd-feder8 "dance"
Master Process
Express
REST/
Web
Service
Client
REST
Server
REST
Server
REST
Server
Web Service
Server
Web Service
Server
Named
Group
Worker Process ewd-feder8
ewd-qoper8
cache.node
ewd-qoper8-cache
Caché
ewd-document-store
ewd-session
EWD Sessions
can also be used –
potentially easier to
use and manage

More Related Content

What's hot

EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts Here
Rob Tweed
 
qewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle Tierqewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle Tier
Rob 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 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
Rob Tweed
 
EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Data...
EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Data...EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Data...
EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Data...
Rob 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 APIs
Rob 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 Application
Rob 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 Mode
Rob 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 QEWD
Rob 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 Modules
Rob Tweed
 
QEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It TooQEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It Too
Rob 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 Functionality
Rob 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 Service
Rob Tweed
 
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Servicesewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
Rob 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 Session
Rob Tweed
 
EWD 3 Training Course Part 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWDEWD 3 Training Course Part 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWD
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 Services
Rob Tweed
 
EWD 3 Training Course Part 7: Applying the QEWD Messaging Pattern
EWD 3 Training Course Part 7: Applying the QEWD Messaging PatternEWD 3 Training Course Part 7: Applying the QEWD Messaging Pattern
EWD 3 Training Course Part 7: Applying the QEWD Messaging Pattern
Rob 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 Appliance
Rob Tweed
 
EWD 3 Training Course Part 12: QEWD Session Timeout Control
EWD 3 Training Course Part 12: QEWD Session Timeout ControlEWD 3 Training Course Part 12: QEWD Session Timeout Control
EWD 3 Training Course Part 12: QEWD Session Timeout Control
Rob Tweed
 

What's hot (20)

EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts Here
 
qewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle Tierqewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle Tier
 
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 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 1: How Node.js Integrates With Global Storage Data...
EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Data...EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Data...
EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Data...
 
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 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 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 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 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
 
QEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It TooQEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It Too
 
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
 
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
 
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Servicesewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
 
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 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWDEWD 3 Training Course Part 11: Handling Errors in QEWD
EWD 3 Training Course Part 11: Handling Errors in QEWD
 
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 7: Applying the QEWD Messaging Pattern
EWD 3 Training Course Part 7: Applying the QEWD Messaging PatternEWD 3 Training Course Part 7: Applying the QEWD Messaging Pattern
EWD 3 Training Course Part 7: Applying the QEWD Messaging Pattern
 
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 12: QEWD Session Timeout Control
EWD 3 Training Course Part 12: QEWD Session Timeout ControlEWD 3 Training Course Part 12: QEWD Session Timeout Control
EWD 3 Training Course Part 12: QEWD Session Timeout Control
 

Similar to EWD 3 Training Course Part 2: EWD 3 Overview

The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)
Geekstone
 
JavaScript Modules Done Right
JavaScript Modules Done RightJavaScript Modules Done Right
JavaScript Modules Done Right
Mariusz Nowak
 
Open Source, infrastructure as Code, Cloud Native Apps 2015
Open Source, infrastructure as Code, Cloud Native Apps 2015Open Source, infrastructure as Code, Cloud Native Apps 2015
Open Source, infrastructure as Code, Cloud Native Apps 2015
Jonas Rosland
 
QEWD Update
QEWD UpdateQEWD Update
QEWD Update
Rob Tweed
 
Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6
Ido Flatow
 
Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ...
 Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ... Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ...
Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ...
Mikko Ohtamaa
 
Introduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureIntroduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azure
Colin Mackay
 
Day in a life of a node.js developer
Day in a life of a node.js developerDay in a life of a node.js developer
Day in a life of a node.js developer
Edureka!
 
Day In A Life Of A Node.js Developer
Day In A Life Of A Node.js DeveloperDay In A Life Of A Node.js Developer
Day In A Life Of A Node.js Developer
Edureka!
 
Beginners Node.js
Beginners Node.jsBeginners Node.js
Beginners Node.js
Khaled Mosharraf
 
Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6
Ganesh Kondal
 
Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteor
Sapna Upreti
 
Zend
ZendZend
Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)
Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)
Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)
Arrow Consulting & Design
 
Node js
Node jsNode js
Intro to Sails.js
Intro to Sails.jsIntro to Sails.js
Intro to Sails.js
DevOpsDays Austin 2014
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS
drupalcampest
 
EWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
EWD 3 Training Course Part 6: What Happens when a QEWD Application is StartedEWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
EWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
Rob Tweed
 
OSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js TutorialOSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js Tutorial
Tom Croucher
 
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
Rob Tweed
 

Similar to EWD 3 Training Course Part 2: EWD 3 Overview (20)

The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)
 
JavaScript Modules Done Right
JavaScript Modules Done RightJavaScript Modules Done Right
JavaScript Modules Done Right
 
Open Source, infrastructure as Code, Cloud Native Apps 2015
Open Source, infrastructure as Code, Cloud Native Apps 2015Open Source, infrastructure as Code, Cloud Native Apps 2015
Open Source, infrastructure as Code, Cloud Native Apps 2015
 
QEWD Update
QEWD UpdateQEWD Update
QEWD Update
 
Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6
 
Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ...
 Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ... Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ...
Beautiful Maintainable ModularJavascript Codebase with RequireJS - HelsinkiJ...
 
Introduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureIntroduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azure
 
Day in a life of a node.js developer
Day in a life of a node.js developerDay in a life of a node.js developer
Day in a life of a node.js developer
 
Day In A Life Of A Node.js Developer
Day In A Life Of A Node.js DeveloperDay In A Life Of A Node.js Developer
Day In A Life Of A Node.js Developer
 
Beginners Node.js
Beginners Node.jsBeginners Node.js
Beginners Node.js
 
Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6Tech io nodejs_20130531_v0.6
Tech io nodejs_20130531_v0.6
 
Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteor
 
Zend
ZendZend
Zend
 
Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)
Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)
Getting Started with ASP.NET Core 1.0 (formerly ASP.NET 5)
 
Node js
Node jsNode js
Node js
 
Intro to Sails.js
Intro to Sails.jsIntro to Sails.js
Intro to Sails.js
 
Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS Developing realtime apps with Drupal and NodeJS
Developing realtime apps with Drupal and NodeJS
 
EWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
EWD 3 Training Course Part 6: What Happens when a QEWD Application is StartedEWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
EWD 3 Training Course Part 6: What Happens when a QEWD Application is Started
 
OSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js TutorialOSCON 2011 - Node.js Tutorial
OSCON 2011 - Node.js Tutorial
 
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
 

More from Rob Tweed

Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language Feature
Rob Tweed
 
LNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooLNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It Too
Rob 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 5
Rob 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 4
Rob 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 3
Rob 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 2
Rob 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 Locking
Rob 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 CORS
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/HTTPS
Rob 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 Indexing
Rob 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 Capabilities
Rob 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 Nodes
Rob Tweed
 

More from Rob Tweed (12)

Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language Feature
 
LNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooLNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It Too
 
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 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 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 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 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
 

Recently uploaded

High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...
High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...
High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...
singhlata50dh
 
03. Ruby Variables & Regex - Ruby Core Teaching
03. Ruby Variables & Regex - Ruby Core Teaching03. Ruby Variables & Regex - Ruby Core Teaching
03. Ruby Variables & Regex - Ruby Core Teaching
quanhoangd129
 
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
rachitkumar09887
 
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
87tomato
 
07. Ruby String Slides - Ruby Core Teaching
07. Ruby String Slides - Ruby Core Teaching07. Ruby String Slides - Ruby Core Teaching
07. Ruby String Slides - Ruby Core Teaching
quanhoangd129
 
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
OnePlan Solutions
 
01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching
quanhoangd129
 
How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024
TaskSprint | Employee Efficiency Software
 
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
shanihomely
 
02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching
quanhoangd129
 
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
902basic
 
TEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with YouTEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with You
marcofolio
 
Empowering Businesses with Intelligent Software Solutions - Grawlix
Empowering Businesses with Intelligent Software Solutions - GrawlixEmpowering Businesses with Intelligent Software Solutions - Grawlix
Empowering Businesses with Intelligent Software Solutions - Grawlix
Aarisha Shaikh
 
08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching
quanhoangd129
 
05. Ruby Control Structures - Ruby Core Teaching
05. Ruby Control Structures - Ruby Core Teaching05. Ruby Control Structures - Ruby Core Teaching
05. Ruby Control Structures - Ruby Core Teaching
quanhoangd129
 
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
andrehoraa
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
45unexpected
 
Tour and travel website management in odoo,
Tour and travel website management in odoo,Tour and travel website management in odoo,
Tour and travel website management in odoo,
Axis Technolabs
 
Applitools Autonomous 2.0 Sneak Peek.pdf
Applitools Autonomous 2.0 Sneak Peek.pdfApplitools Autonomous 2.0 Sneak Peek.pdf
Applitools Autonomous 2.0 Sneak Peek.pdf
Applitools
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
revolutionary575
 

Recently uploaded (20)

High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...
High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...
High Girls Call Chennai 000XX00000 Provide Best And Top Girl Service And No1 ...
 
03. Ruby Variables & Regex - Ruby Core Teaching
03. Ruby Variables & Regex - Ruby Core Teaching03. Ruby Variables & Regex - Ruby Core Teaching
03. Ruby Variables & Regex - Ruby Core Teaching
 
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
 
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
 
07. Ruby String Slides - Ruby Core Teaching
07. Ruby String Slides - Ruby Core Teaching07. Ruby String Slides - Ruby Core Teaching
07. Ruby String Slides - Ruby Core Teaching
 
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
Maximizing Efficiency and Profitability: Optimizing Data Systems, Enhancing C...
 
01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching
 
How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024How To Fill Timesheet in TaskSprint: Quick Guide 2024
How To Fill Timesheet in TaskSprint: Quick Guide 2024
 
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
 
02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching
 
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
 
TEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with YouTEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with You
 
Empowering Businesses with Intelligent Software Solutions - Grawlix
Empowering Businesses with Intelligent Software Solutions - GrawlixEmpowering Businesses with Intelligent Software Solutions - Grawlix
Empowering Businesses with Intelligent Software Solutions - Grawlix
 
08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching
 
05. Ruby Control Structures - Ruby Core Teaching
05. Ruby Control Structures - Ruby Core Teaching05. Ruby Control Structures - Ruby Core Teaching
05. Ruby Control Structures - Ruby Core Teaching
 
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
 
Tour and travel website management in odoo,
Tour and travel website management in odoo,Tour and travel website management in odoo,
Tour and travel website management in odoo,
 
Applitools Autonomous 2.0 Sneak Peek.pdf
Applitools Autonomous 2.0 Sneak Peek.pdfApplitools Autonomous 2.0 Sneak Peek.pdf
Applitools Autonomous 2.0 Sneak Peek.pdf
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
 

EWD 3 Training Course Part 2: EWD 3 Overview

  • 1. Copyright © 2016 M/Gateway Developments Ltd EWD 3 Training Course Part 2 Overview of EWD 3 Rob Tweed Director, M/Gateway Developments Ltd Twitter: @rtweed
  • 2. Copyright © 2016 M/Gateway Developments Ltd EWD 3 Design Aims • Modularising previous-generation (EWD.js) into independent components • Mix and match "buffet" of components • Interoperable with other Node.js modules, eg Express • No core dependence on particular databases • Redis, Caché and GT.M can be used as embedded multi- model databases • But any other Node.js-interfaced database can be used too
  • 3. Copyright © 2016 M/Gateway Developments Ltd Core EWD 3 Component • ewd-qoper8
  • 4. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 • Very high-performance Node.js Message Queue • Master Node.js process: • Queue & dispatch mechanism • Pool of persistent Worker Node.js processes • These process the requests that are put on the queue
  • 5. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 • Creates an isolated run-time environment for each handler function • Each worker process only handles a single request at a time • Comparable to AWS Lambda's run-time container • Concurrency is handled by the master process only • Its sole purpose is to queue and dispatch incoming requests to an available worker process, and handle the response/results from the worker
  • 6. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 • Worker processes are persistent – Started on demand – When a worker process finishes processing a request, it is returned to the available pool, ready to process another request – No startup / tear-down cost
  • 7. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 • Master process API – this.addToQueue(messageObject) • Adds a message to the queue – this.on('response', function(responseObject, workerPid) {..} • Handles the response from worker – Usually simply returning the response to the client that sent the original request message to the master process
  • 8. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 • What the worker does to process a message is up to you • You define a custom worker module • Worker API: – this.on('message', function(messageObject, send, finished) {..} • finished(responseObject): – Mandatory function – Sends final response to master process – Releases Worker process back to available pool • send(responseObject): – Optional function – Sends a response to master process – Worker process remains unavailable
  • 9. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Node.js Worker Process Node.js Worker Process
  • 10. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher addToQueue(obj)
  • 11. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher
  • 12. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher
  • 13. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module ewd-qoper8
  • 14. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8
  • 15. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Unavailable Node.js Worker Process Custom Worker Module ewd-qoper8 Begin processing message
  • 16. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Unavailable worker.on('message', function(messageObj) { // process message }); Node.js Worker Process Custom Worker Module ewd-qoper8 Begin processing message
  • 17. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing addToQueue(obj) Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8
  • 18. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 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 ewd-qoper8 Node.js Worker Process Custom Worker Module ewd-qoper8 Worker pool size not exceeded:
  • 19. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8 Worker pool all busy: Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8 Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8 New request remains in queue
  • 20. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8 As soon as a worker is available again: Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8 Available Node.js Worker Process Custom Worker Module ewd-qoper8
  • 21. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8 Worker pool all busy: Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8 Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8
  • 22. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 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 ewd-qoper8 finished(responseObject);
  • 23. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher Finished this.on('response', function(responseObj) { // do something with the response }); Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module ewd-qoper8
  • 24. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module ewd-qoper8 Worker automatically returned to the available pool NB: Workers are NOT destroyed after use Removes overhead of continually starting worker processes
  • 25. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module ewd-qoper8 Worker processes only handle a single request at a time Completely isolated run-time environment for your handler functions Worker process becomes immediately available for the next queued request when processing completed
  • 26. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 is a building block • Not really useful on its own • Completely generic, general-purpose message queue • Core piece of infrastructure on which the rest of EWD 3 is built – ewd-qoper8 can also be used independently of the other EWD 3 modules and integrated with any other Node.js modules, databases etc
  • 27. Copyright © 2016 M/Gateway Developments Ltd Express + ewd-qoper8 • Express is the standard Node.js web server – REST, Web Services, interactive applications – Express is a Node.js module – Customised by defining middleware – ewd-qoper8 can be configured as Express middleware • Requests sent to Express by client • Routed to ewd-qoper8 • ewd-qoper8 queues and processes them • ewd-qoper8 response returned via Express to client
  • 28. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + Express Queue Queue processor/ dispatcher Express HTTP(S) Interface WebSocket socket.io Interface addToQueue(req) Node.js Worker Process Custom Worker Module ewd-qoper8
  • 29. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + Express + ewd-qoper8-express Queue Queue processor/ dispatcher Express HTTP(S) Interface Automates and simplifies the use of ewd-qoper8 with Express for HTTP requests Adds special Express router function app.use('/qoper8', qx.router()); ewd-qoper8-express ewd-qoper8- express Node.js Worker Process Custom Worker Module ewd-qoper8
  • 30. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + Express + ewd-qoper8-express Queue Queue processor/ dispatcher Express HTTP(S) Interface Message constructed from Express req object – all information needed for back-end processing by Worker: -path -method -headers -query -body -etc ewd-qoper8-express ewd-qoper8- express Node.js Worker Process Custom Worker Module ewd-qoper8
  • 31. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 Database Dependency? • ewd-qoper8 itself does not have a dependency on a database – In-memory queue – Master and Workers are just Node.js processes * see later parts of this course for details on how to add queue backup / resilience
  • 32. Copyright © 2016 M/Gateway Developments Ltd Using ewd-qoper8 with Caché • Use a separate module: – ewd-qoper8-cache • Normally used by worker processes • Makes use of cache.node interface module – cache.node is a proprietary InterSystems module that is included with Caché – Allows access from JavaScript/Node.js to: » Caché extrinsic functions » Global storage » Caché Objects & methods – JavaScript API defined by InterSystems » Low-level
  • 33. Copyright © 2016 M/Gateway Developments Ltd Using ewd-qoper8 with GT.M • Use a separate module: – ewd-qoper8-gtm • Normally used by worker processes • Makes use of NodeM interface module – NodeM is an Open Source module for use with GT.M, which implements the cache.node APIs – Allows access from JavaScript/Node.js to: » GT.M extrinsic functions » Global storage – JavaScript API originally defined by InterSystems » Low-level
  • 34. Copyright © 2016 M/Gateway Developments Ltd Using ewd-qoper8 with Redis • Use a separate module: – ewd-qoper8-redis • Normally used by worker processes • Makes use of ewd-redis-globals module – ewd-redis-globals is an Open Source module for use with Redis, which: » Implements Global Storage functionality » implements the cache.node APIs – Allows access from JavaScript/Node.js to: » Global storage » Uses the tcp-netx module to connect to Redis – JavaScript API originally defined by InterSystems » Low-level
  • 35. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module cache.node ewd-qoper8-cache Caché ewd-qoper8
  • 36. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-gtm Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module nodem ewd-qoper8-gtm GT.M ewd-qoper8 Equivalent module for use with GT.M Uses David Wicksell’s NodeM module which emulates cache.node for GT.M
  • 37. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-redis Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module tcp-netx ewd-qoper8-redis Redis ewd-qoper8 Equivalent module for use with Redis Redis behaves as a Global Storage Database via the same cache.node APIs ewd-redis-globals
  • 38. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché function Custom Worker Module ewd-qoper8 For legacy Mumps or Caché ObjectScript Function integration
  • 39. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-gtm Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher nodem ewd-qoper8-gtm GT.M function Custom Worker Module ewd-qoper8 For legacy Mumps Function integration
  • 40. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché Globals Custom Worker Module ewd-qoper8 Basic low-level Mumps-centric API
  • 41. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-gtm Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher nodem ewd-qoper8-gtm GT.M Globals Custom Worker Module ewd-qoper8 Basic low-level Mumps-centric API
  • 42. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-redis Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module tcp-netx ewd-qoper8-redis Redis ewd-qoper8 ewd-redis-globals Globals Basic low-level API
  • 43. Copyright © 2016 M/Gateway Developments Ltd JavaScript-centric database access • ewd-qoper8-cache, ewd-qoper8-gtm and ewd-qoper8-redis auto-install ewd- document-store • ewd-document-store provides a JavaScript-oriented abstraction of Global Storage database: – "persistent JavaScript Objects" – Document database • Fine-grained storage of JSON
  • 44. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache + ewd-document-store Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Custom Worker Module ewd-qoper8
  • 45. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache + ewd-document-store Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Globals Persistent JavaScript Objects & Fine-grained Document Database Custom Worker Module ewd-qoper8
  • 46. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-gtm + ewd-document-store Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher nodem ewd-qoper8-gtm GT.M ewd-document-store Globals Persistent JavaScript Objects & Fine-grained Document Database Custom Worker Module ewd-qoper8
  • 47. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-redis + ewd-document-store Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module tcp-netx Redis ewd-qoper8 ewd-redis-globals Globals ewd-qoper8-gtm ewd-document-store Persistent JavaScript Objects & Fine-grained Document Database
  • 48. Copyright © 2016 M/Gateway Developments Ltd ewd-document-store myDocument “a” 123 “b” “c2” “foo2” “d” “c1” “foo” “e2” “e1” “f2” “bar2” “f1” “bar1” “f2” “bar2” “f1” “bar1” “f3” “bar3” myDocument = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { e1: { f1: 'bar1', f2: 'bar2' }, e2: { f1: 'bar1', f2: 'bar2', f3: 'bar3' } } }
  • 49. Copyright © 2016 M/Gateway Developments Ltd ewd-document-store myDocument “a” 123 “b” “c2” “foo2” “d” “c1” “foo” “e2” “e1” “f2” “bar2” “f1” “bar1” “f2” “bar2” “f1” “bar1” “f3” “bar3” var f3node = new this.documentStore.DocumentNode('myDocument', ['d', 'e2', 'f3']);
  • 50. Copyright © 2016 M/Gateway Developments Ltd ewd-document-store myDocument “a” 123 “b” “c2” “foo2” “d” “c1” “foo” “e2” “e1” “f2” “bar2” “f1” “bar1” “f2” “bar2” “f1” “bar1” “f3” “bar3” var value = f3Node.value; // 'bar3'
  • 51. Copyright © 2016 M/Gateway Developments Ltd ewd-document-store myDocument “a” 123 “b” “c2” “foo2” “d” “c1” “foo” “e2” “e1” “f2” “bar2” “f1” “bar1” “f2” “bar2” “f1” “bar1” “f3” “bar3” var value = f3Node.parent.$('f2').value; // 'bar2'
  • 52. Copyright © 2016 M/Gateway Developments Ltd ewd-document-store myDocument “a” 123 “b” “c2” “foo2” “d” “c1” “foo” “e2” “e1” “f2” “bar2” “f1” “bar1” “f2” “bar2” “f1” “bar1” “f3” “bar3” myDocument = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { e1: { f1: 'bar1', f2: 'bar2' }, e2: { f1: 'bar1', f2: 'bar2', f3: 'bar3' } } } var docOnDisk = new this.documentStore.DocumentNode('myDocument'); var localDoc = docOnDisk.getDocument();
  • 53. Copyright © 2016 M/Gateway Developments Ltd ewd-document-store myDocument “a” 123 “b” “c2” “foo2” “d” “c1” “foo” “e2” “e1” “f2” “bar2” “f1” “bar1” “f2” “bar2” “f1” “bar1” “f3” “bar3” myDocument = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { e1: { f1: 'bar1', f2: 'bar2' }, e2: { f1: 'bar1', f2: 'bar2', f3: 'bar3' } } } var docOnDisk = new this.documentStore.DocumentNode('myDocument'); docOnDisk.setDocument(localDoc);
  • 54. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache + ewd-document-store Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Globals This powerful & intuitive abstraction requires synchronous access ewd-qoper8 provides the isolated run-time container to make this possible Custom Worker Module ewd-qoper8
  • 55. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-gtm + ewd-document-store Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher nodem ewd-qoper8-gtm GT.M ewd-document-store Globals Custom Worker Module ewd-qoper8 This powerful & intuitive abstraction requires synchronous access ewd-qoper8 provides the isolated run-time container to make this possible
  • 56. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-redis + ewd-document-store Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module tcp-netx Redis ewd-qoper8 ewd-redis-globals Globals ewd-qoper8-gtm ewd-document-store This powerful & intuitive abstraction requires synchronous access ewd-qoper8 provides the isolated run-time container to make this possible
  • 57. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 for synchronous database access • A worker process only handles one request object at a time • Any blocking database (or other) I/O has no impact on the processing of other requests – Each request independently handled, isolated in its own worker
  • 58. Copyright © 2016 M/Gateway Developments Ltd Sessions • EWD 3 uses a stateless model for web access • Each request from a client may be processed by a different ewd-qoper8 worker process • Usually you need to maintain state information across a sequence of client requests • EWD Sessions provide this capability • The ewd-session module allows you to create and maintain Sessions – Sessions are automatically mapped to ewd-document DocumentNode objects
  • 59. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache + ewd-document-store + ewd-session Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Globals ewd-session Session storage projected as DocumentNode objects Custom Worker Module ewd-qoper8
  • 60. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-gtm + ewd-document-store + ewd-session Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher nodem ewd-qoper8-gtm GT.M ewd-document-store Globals ewd-session Session storage projected as DocumentNode objects Custom Worker Module ewd-qoper8
  • 61. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-redis + ewd-document-store + ewd-session Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module tcp-netx Redis ewd-qoper8 ewd-redis-globals Globals ewd-qoper8-gtm ewd-document-store ewd-session Session storage projected as DocumentNode objects
  • 62. Copyright © 2016 M/Gateway Developments Ltd ewd-session APIs • sessions.create(applicationName) – Creates a new session, associated with the specified application – Returns a session token • Randomly-generated uuid string • sessions.authenticate(token) – Checks that token is valid and has not yet expired – returns the session object for the token, or an error
  • 63. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache*+ ewd-document-store + ewd-session Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Globals ewd-session var session = sessions.create('vista'); Send back session.token Custom Worker Module ewd-qoper8 * Applies also to ewd-qoper8-gtm and ewd-qoper8-redis
  • 64. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache* + ewd-document-store + ewd-session Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Globals ewd-session var result = sessions.authenticate(token); Returns result.session if successful / result.error if not Custom Worker Module ewd-qoper8 * Applies also to ewd-qoper8-gtm and ewd-qoper8-redis
  • 65. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache* + ewd-document-store + ewd-session Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Globals ewd-session Session object extends GlobalNode object Adds session-specific properties & methods Custom Worker Module ewd-qoper8 * Applies also to ewd-qoper8-gtm and ewd-qoper8-redis
  • 66. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8 + ewd-qoper8-cache + ewd-document-store + ewd-session + Express Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher cache.node ewd-qoper8-cache Caché ewd-document-store Globals ewd-session Express HTTP(S) Interface WebSocket socket.io Interface Custom Worker Module ewd-qoper8 Functions
  • 67. Copyright © 2016 M/Gateway Developments Ltd Pre-packaged super-modules • QEWD (formally known as ewd-xpress) – Quick and Easy Web Development platform for: • Interactive browser-based applications – Web-sockets or Ajax • Web and REST services • Embedded persistent JSON store / session cache using: – Caché, GT.M or Redis • Compatible with all modern JavaScript front-end frameworks • ewd-qoper8-vistarpc – REST interface to VistA RPCs • ewd-feder8 – Federation / integration platform • Extension of QEWD – Lightweight enterprise service bus functionality
  • 68. Copyright © 2016 M/Gateway Developments Ltd QEWD (using Caché) Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher ewd-xpress cache.node ewd-qoper8-cache Caché ewd-document-store Globals ewd-session Express HTTP(S) Interface WebSocket socket.io Interface browserewd-client Custom Worker Module ewd-qoper8 Functions
  • 69. Copyright © 2016 M/Gateway Developments Ltd QEWD (using GT.M) Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher ewd-xpress nodem ewd-qoper8-gtm GT.M ewd-document-store Globals ewd-session Express HTTP(S) Interface WebSocket socket.io Interface browserewd-client Custom Worker Module ewd-qoper8 Functions
  • 70. Copyright © 2016 M/Gateway Developments Ltd QEWD (using Redis) Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher ewd-xpress ewd-redis-globals ewd-qoper8-redis Redis ewd-document-store Globals ewd-session Express HTTP(S) Interface WebSocket socket.io Interface browserewd-client Custom Worker Module ewd-qoper8 tcp-netx
  • 71. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8-vistarpc (using Caché) Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher ewd-qoper8- vistarpc cache.node ewd-qoper8-cache ewd-document-store Globals ewd-session Express HTTP(S) Interface REST RPCs Interface function Caché & VistA Symbol Table Custom Worker Module ewd-qoper8 Symbol Table Function
  • 72. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8-vistarpc (using GT.M) Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher ewd-qoper8- vistarpc nodem ewd-qoper8-gtm ewd-document-store Globals ewd-session Express HTTP(S) Interface REST RPCs Interface function GT.M & VistA Symbol Table Custom Worker Module ewd-qoper8 Symbol Table Function
  • 73. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8-vistarpc • Login: (POST) – Access & verify codes – XUS SIGNON SETUP – XUS AV CODE – Returns error or greeting object – If successful: • Creates new Session • Symbol table saved to Session – Contains DUZ etc – No direct access by REST client – Only Indirect access via Authorization token • Return Session Token & VistA greeting 20 – 30ms round trip
  • 74. Copyright © 2016 M/Gateway Developments Ltd ewd-qoper8-vistarpc • If logged in - runRPC: – Use Session token in Authorization header – POST: • RPC name • RPC arguments object – Symbol table restored from Session • Contains DUZ etc • Determines whether user can run RPC – Standard Mumps-side "business as usual" logic – Return RPC result – Save Symbol table to Session
  • 75. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher ewd-feder8 cache.node ewd-qoper8-cache Caché ewd-document-store Globals ewd-session Express HTTP(S) Interface Custom Worker Module ewd-qoper8 REST/ Web Service Client ewd-xpress Also works with GT.M and Redis
  • 76. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Master Process Express REST/ Web Service Client Worker Process ewd-feder8 ewd-qoper8 REST Server REST Server REST Server Web Service Server Web Service Server cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session
  • 77. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Master Process Express REST/ Web Service Client Worker Process ewd-feder8 ewd-qoper8 REST Server REST Server REST Server Web Service Server Web Service Server cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Named Group
  • 78. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session
  • 79. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Copy of request sent to all servers in group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session
  • 80. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Responses Received asynchronously Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session
  • 81. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Last response Received Aggregate response object created Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session
  • 82. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 Master Process Express REST/ Web Service Client Worker Process ewd-feder8 Custom Worker Module ewd-qoper8 REST Server REST Server REST Server Web Service Server Web Service Server cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Named Group Aggregate response Returned to client via Master process
  • 83. Copyright © 2016 M/Gateway Developments Ltd Aggregate response { Server_1_name: {responseObject}, Server_2_name: {errorObject}, Server_3_name: {responseObject} }
  • 84. Copyright © 2016 M/Gateway Developments Ltd Interception / Customisation • ewd-feder8 emits events: – When it receives a request from a client – When it receives a response from an end- point server – When an aggregate response is ready for return to a client • These can be used to: – Intercept the flow through ewd-feder8; and – Customise the behaviour of ewd-feder8
  • 85. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session
  • 86. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Intercept response Possibly modify it And/or determine action based on response
  • 87. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Forward new request to group of servers
  • 88. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Intercept aggregate Response Decide what to do
  • 89. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Send new request
  • 90. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Intercept response Create final response
  • 91. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Return final response to client
  • 92. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session Cache can be Used to store/ build up final response during "dance"
  • 93. Copyright © 2016 M/Gateway Developments Ltd ewd-feder8 "dance" Master Process Express REST/ Web Service Client REST Server REST Server REST Server Web Service Server Web Service Server Named Group Worker Process ewd-feder8 ewd-qoper8 cache.node ewd-qoper8-cache Caché ewd-document-store ewd-session EWD Sessions can also be used – potentially easier to use and manage