SlideShare a Scribd company logo
1 of 32
Copyright © 2016 M/Gateway Developments Ltd
EWD 3 Training Course
Part 1
How Node.js Integrates with
Global Storage Databases
Rob Tweed
Director, M/Gateway Developments Ltd
Twitter: @rtweed
Copyright © 2016 M/Gateway Developments Ltd
Global Storage Databases
• InterSystems Caché
– Proprietary, commercially-licensed
– Windows, Linux, OS X
– http://www.intersystems.com/our-products/cache/cache-overview/
• FIS GT.M
– Free, Open Source
– Linux
– https://www.fisglobal.com/Solutions/Banking-and-Wealth/Services/Database-Engine
• Redis, via ewd-redis-globals
– https://github.com/robtweed/ewd-redis-globals
Copyright © 2016 M/Gateway Developments Ltd
Node.js
• Node.js:
– Server-side JavaScript
– Single thread of execution
– JavaScript is the world's most popular computer
language, by a considerable (and growing) margin
Copyright © 2016 M/Gateway Developments Ltd
Caché
• High-performance multi-model NoSQL
database
– Hierarchical underlying data structure
• "Global Storage"
• Normally accessed via built-in language
– Cache ObjectScript
• Extension/ super-set of MUMPS language
– Considered obsolete by IT mainstream
Copyright © 2016 M/Gateway Developments Ltd
GT.M
• High-performance multi-model NoSQL
database
– Hierarchical underlying data structure
• "Global Storage"
– Normally accessed via built-in language
• MUMPS
• Considered obsolete by IT mainstream
Copyright © 2016 M/Gateway Developments Ltd
Redis / ewd-redis-globals
• Redis:
– Probably the world's most popular Open
Source NoSQL databases
– Also one of the fastest
– Key/Value storage primitive data structures
• ewd-redis-globals:
– Global storage functionality implemented on
top of Redis database key/value primitives
– Database only
• No dependency on Mumps language
• Open source equivalent to InterSystems'
GlobalsDB
Copyright © 2016 M/Gateway Developments Ltd
Making Global Storage
mainstream
• Global Storage has proven to be a very
powerful, flexible, high-performance NoSQL
database model for real-world, demanding
applications
• It has been ignored by the mainstream by virtue
of its integrated access language being seen as
out-dated / obsolete
– "database baby has been thrown out with the
language bathwater"
• JavaScript as a primary language for accessing
Global Storage databases?
Copyright © 2016 M/Gateway Developments Ltd
Node.js Interface
• Actually first implemented for free (but not Open
Source) GlobalsDB database
– Core engine from Caché
– No language parser/engine
– Now deprecated by InterSystems
• Accessed via the database engine's C++ call-in
interface
– Originally Java & .Net only
• Node.js interface developed by Chris Munt
• Interface module file: cache.node
Copyright © 2016 M/Gateway Developments Ltd
Node.js Interface
• cache.node ported to Cache
• function() API added to allow
MUMPS/Cache Objectscript code to be
executed from JavaScript / Node.js
• Cache Object APIs also subsequently
added
• Network (TCP-based) interface is also
available
Copyright © 2016 M/Gateway Developments Ltd
cache.node interface
Node.js
Process
Caché
Process
cache.node
module
C++call-ininterface
JavaScript
Globals Functions Objects
Copyright © 2016 M/Gateway Developments Ltd
GT.M / NodeM
• cache.node APIs re-implemented by Open
Source community (David Wicksell) for
use with GT.M
– https://github.com/dlwicksell/nodem
– Interfaces with GT.M's C Call-in interface
Copyright © 2016 M/Gateway Developments Ltd
NodeM interface
Node.js
Process
GT.M
Process
NodeM
module
Ccall-ininterface
JavaScript
Globals Functions
Copyright © 2016 M/Gateway Developments Ltd
Redis / ewd-redis-globals
• cache.node APIs re-implemented as part
of the ewd-redis-globals module
– Interfaces with Redis via its standard TCP
connection
Copyright © 2016 M/Gateway Developments Ltd
In-process Node.js Interfaces to
Cache & GT.M
• Very closely-coupled, intimate relationship
between Node.js and Caché / GT.M
– In-process
• The Node.js process and connected Caché / GT.M
process are one and the same
– Node.js process.pid === Caché/GT.M $job
– Node.js must be installed on the Caché or
GT.M server
Copyright © 2016 M/Gateway Developments Ltd
cache.node interface
cache.node
module
C++call-ininterface
JavaScript
Globals Functions Objects
CachéNode.jsProcess
Copyright © 2016 M/Gateway Developments Ltd
In-process Node.js Interface
• Very fast connection
– Significantly faster than a networked
connection between Node.js and Caché
– Currently between ⅓ and ¼ the performance
of native Mumps code when accessing Global
storage
– Currently limited by Google V8 API bottleneck
• https://bugs.chromium.org/p/v8/issues/detail?id=5144
• Potential for full native Mumps performance
Copyright © 2016 M/Gateway Developments Ltd
Networked interfaces
• Available for Caché and Redis/ewd-redis-globals
• Allows database and Node.js to be on different
physical servers
• Trade-off between performance and flexibility /
redundancy
Copyright © 2016 M/Gateway Developments Ltd
JavaScript access to Global
Storage
• The JavaScript / Node.js APIs for accessing
Global storage are identical, regardless of
database type and connection type
• Defined by the original cache.node APIs
• http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS
Copyright © 2016 M/Gateway Developments Ltd
Installing cache.node
• Currently included with Cache build kits
– Not distributed separately
– Hoping that InterSystems will soon distribute via NPM
• Different Node.js versions have introduced API changes
– Different versions of cache.node for each main Node.js version
• 12.x
– cache0120.node
• 4.1.x
– cache410.node
• 4.2 and later 4.x versions
– Cache421.node
– Rename to cache.node and copy to main node_modules
directory
• Eg C:ewd3node_modulescache.node
Copyright © 2016 M/Gateway Developments Ltd
Installing NodeM for GT.M
• Node.js Add-in module
• See:
– https://github.com/dlwicksell/nodem
Copyright © 2016 M/Gateway Developments Ltd
ewd-redis-globals
• Assumes you have Redis installed
• ewd-redis-globals:
– Node.js module
• https://github.com/robtweed/ewd-redis-globals
– Implements Global Storage functionality using
Redis primitive data structures
– Provides the JavaScript APIs for accessing
Global Storage
• Complies with the cache.node API definitions
Copyright © 2016 M/Gateway Developments Ltd
Connecting to Caché
var interface = require('cache'); // loads cache.node
var db = new interface.Cache();
// Change these parameters to match your Cache system:
var ok = db.open({
path: '/opt/cache/mgr',
username: '_SYSTEM',
password: 'SYS',
namespace: 'USER'
});
// confirm it connected OK
console.log('ok: ' + JSON.stringify(ok));
console.log(db.version());
Create a test
Script file, eg
C:ewd3test.js
Copyright © 2016 M/Gateway Developments Ltd
Connecting to GT.M
var interface = require('nodem'); // loads NodeM
var db = new interface.Gtm();
// Assuming your process profile is automatically configured
// for GT.M:
var ok = db.open();
// confirm it connected OK
console.log('ok: ' + JSON.stringify(ok));
console.log(db.version());
// once connected, the APIs for GT.M are identical to
// those for Cache
Create a test
Script file, eg
C:ewd3test.js
Copyright © 2016 M/Gateway Developments Ltd
Connecting to Redis
var interface = require('ewd-redis-globals');
var db = new interface();
// Assuming Redis is listening on standard port and
// running on localhost:
var ok = db.open();
// confirm it connected OK
console.log('ok: ' + JSON.stringify(ok));
console.log(db.version());
// once connected, the APIs for Redis are identical to
// those for Cache
Create a test
Script file, eg
C:ewd3test.js
Copyright © 2016 M/Gateway Developments Ltd
Connecting to Global Storage
Run the test script file:
cd ewd3
node test
ok: {"ok":1,"result":1}
Node.js Adaptor for Cache: Version: 1.1.104 (CM); Cache Version: 2015.2 build 664
Connection is working!
The version string will be different for GT.M or ewd-redis-globals
Copyright © 2016 M/Gateway Developments Ltd
Simple examples
• Set a Global Node, eg
– set ^test("foo","bar")="hello world"
var node = {
global: 'test',
subscripts: ['foo', 'bar'],
data: 'hello world'
};
db.set(node, function(error, result) {
// do something when node is created
});
Copyright © 2016 M/Gateway Developments Ltd
Simple examples
• Get a Global Node, eg
– Set value = ^test("foo","bar")
var node = {
global: 'test',
subscripts: ['foo', 'bar']
};
db.get(node, function(error, result) {
console.log('value = ' + result.data);
});
Copyright © 2016 M/Gateway Developments Ltd
cache.node APIs
• Open and close database
• Set, get, kill a global node
• Determine if a node is defined ($data)
• Equivalents to $order and $query (forwards and
backwards)
• Global directory listing
• Increment a global node
• Lock/unlock a global node
• Merge one global sub-tree into another
Copyright © 2016 M/Gateway Developments Ltd
cache.node API Documentation
• http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS_refapi
Copyright © 2016 M/Gateway Developments Ltd
cache.node also has APIs for Caché Objects
• invoke_classmethod
– invoke a class method
• create_instance
– create a new instance of an object
• open_instance
– open an existing instance of an object
• get_property
– retrieve the value of a property
• set_property
– set the value of a property
• invoke_method
– invoke a method
• save_instance
– save an instance
• close_instance
– close an instance
• Note: these are ONLY available for Caché!
Copyright © 2016 M/Gateway Developments Ltd
cache.node APIs
• On all platforms, available as asynchronous &
synchronous versions
– If using a single Node.js process for multi-user
access, you must use the async APIs
– Synchronous APIs:
• Slightly faster
• Simpler and more intuitive to use
– Avoid call-back hell or use of Promises etc
• Allow higher-level database abstractions to be created
on top of the basic global storage primitives
– Multi-model NoSQL functionality via JavaScript
• Allow for "embedded" database functionality in Node.js
Copyright © 2016 M/Gateway Developments Ltd
Synchronous cache.node APIs
• Normal limitations of synchronous APIs:
– They block I/O, so have disastrous results on
Node.js concurrency performance
– So, not normally usable with Node.js except
for single-user testing
• However, new run-time environments for
Node.js that provide an isolated run-time
container for a handler function can safely
use synchronous APIs, eg:
– AWS Lambda
– QEWD (previously known as ewd-xpress)

More Related Content

What's hot

Doctrine ORM Internals. UnitOfWork
Doctrine ORM Internals. UnitOfWorkDoctrine ORM Internals. UnitOfWork
Doctrine ORM Internals. UnitOfWorkIllia Antypenko
 
Software architecture for high traffic website
Software architecture for high traffic websiteSoftware architecture for high traffic website
Software architecture for high traffic websiteTung Nguyen Thanh
 
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...AWSKRUG - AWS한국사용자모임
 
Firebase on Android: The Big Picture
Firebase on Android: The Big PictureFirebase on Android: The Big Picture
Firebase on Android: The Big PictureSriyank Siddhartha
 
Docker Registry V2
Docker Registry V2Docker Registry V2
Docker Registry V2Docker, Inc.
 
NodeJS - Server Side JS
NodeJS - Server Side JS NodeJS - Server Side JS
NodeJS - Server Side JS Ganesh Kondal
 
Mobile application testing tutorial
Mobile application testing tutorialMobile application testing tutorial
Mobile application testing tutorialLokesh Agrawal
 
How To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - SlidesHow To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - SlidesSeveralnines
 
Docker networking Tutorial 101
Docker networking Tutorial 101Docker networking Tutorial 101
Docker networking Tutorial 101LorisPack Project
 
Madison PHP - Getting Started with Magento 2
Madison PHP - Getting Started with Magento 2Madison PHP - Getting Started with Magento 2
Madison PHP - Getting Started with Magento 2Mathew Beane
 
Git Flow: un processus de développement Agile
Git Flow: un processus de développement AgileGit Flow: un processus de développement Agile
Git Flow: un processus de développement AgileXavier Hausherr
 
Install Kubernetes Cluster on Azure Platform using kubespray
Install Kubernetes Cluster on Azure Platform using kubesprayInstall Kubernetes Cluster on Azure Platform using kubespray
Install Kubernetes Cluster on Azure Platform using kubesprayVAIBHAV GUPTA
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Visual Engineering
 
Replacing Your Shared Drive with Alfresco - Open Source ECM
Replacing Your Shared Drive with Alfresco - Open Source ECMReplacing Your Shared Drive with Alfresco - Open Source ECM
Replacing Your Shared Drive with Alfresco - Open Source ECMAlfresco Software
 

What's hot (20)

Doctrine ORM Internals. UnitOfWork
Doctrine ORM Internals. UnitOfWorkDoctrine ORM Internals. UnitOfWork
Doctrine ORM Internals. UnitOfWork
 
ASP.MVC Training
ASP.MVC TrainingASP.MVC Training
ASP.MVC Training
 
Swift Introduction
Swift IntroductionSwift Introduction
Swift Introduction
 
Software architecture for high traffic website
Software architecture for high traffic websiteSoftware architecture for high traffic website
Software architecture for high traffic website
 
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
 
Firebase on Android: The Big Picture
Firebase on Android: The Big PictureFirebase on Android: The Big Picture
Firebase on Android: The Big Picture
 
Docker Registry V2
Docker Registry V2Docker Registry V2
Docker Registry V2
 
What’s New in Angular 14?
What’s New in Angular 14?What’s New in Angular 14?
What’s New in Angular 14?
 
NodeJS - Server Side JS
NodeJS - Server Side JS NodeJS - Server Side JS
NodeJS - Server Side JS
 
Mobile application testing tutorial
Mobile application testing tutorialMobile application testing tutorial
Mobile application testing tutorial
 
MongoDB and Node.js
MongoDB and Node.jsMongoDB and Node.js
MongoDB and Node.js
 
How To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - SlidesHow To Set Up SQL Load Balancing with HAProxy - Slides
How To Set Up SQL Load Balancing with HAProxy - Slides
 
Docker networking Tutorial 101
Docker networking Tutorial 101Docker networking Tutorial 101
Docker networking Tutorial 101
 
Munit
MunitMunit
Munit
 
Madison PHP - Getting Started with Magento 2
Madison PHP - Getting Started with Magento 2Madison PHP - Getting Started with Magento 2
Madison PHP - Getting Started with Magento 2
 
Git Flow: un processus de développement Agile
Git Flow: un processus de développement AgileGit Flow: un processus de développement Agile
Git Flow: un processus de développement Agile
 
Install Kubernetes Cluster on Azure Platform using kubespray
Install Kubernetes Cluster on Azure Platform using kubesprayInstall Kubernetes Cluster on Azure Platform using kubespray
Install Kubernetes Cluster on Azure Platform using kubespray
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.
 
Maven Introduction
Maven IntroductionMaven Introduction
Maven Introduction
 
Replacing Your Shared Drive with Alfresco - Open Source ECM
Replacing Your Shared Drive with Alfresco - Open Source ECMReplacing Your Shared Drive with Alfresco - Open Source ECM
Replacing Your Shared Drive with Alfresco - Open Source ECM
 

Similar to EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Databases

EWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage DatabasesEWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage DatabasesRob Tweed
 
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 azureColin Mackay
 
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsEWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsRob Tweed
 
Making Distributed Data Persistent Services Elastic (Without Losing All Your ...
Making Distributed Data Persistent Services Elastic (Without Losing All Your ...Making Distributed Data Persistent Services Elastic (Without Losing All Your ...
Making Distributed Data Persistent Services Elastic (Without Losing All Your ...C4Media
 
On Docker and its use for LHC at CERN
On Docker and its use for LHC at CERNOn Docker and its use for LHC at CERN
On Docker and its use for LHC at CERNSebastien Goasguen
 
DRILETT_AWS_VPC_Presentation_2MB
DRILETT_AWS_VPC_Presentation_2MBDRILETT_AWS_VPC_Presentation_2MB
DRILETT_AWS_VPC_Presentation_2MBDavid Rilett
 
Practical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsPractical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsasync_io
 
Drilett aws vpc_presentation_shared
Drilett aws vpc_presentation_sharedDrilett aws vpc_presentation_shared
Drilett aws vpc_presentation_sharedDavid Rilett
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetesDeploying windows containers with kubernetes
Deploying windows containers with kubernetesBen Hall
 
Introduction to Node (15th May 2017)
Introduction to Node (15th May 2017)Introduction to Node (15th May 2017)
Introduction to Node (15th May 2017)Lucas Jellema
 
Michael stack -the state of apache h base
Michael stack -the state of apache h baseMichael stack -the state of apache h base
Michael stack -the state of apache h basehdhappy001
 
apidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleuls
apidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleulsapidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleuls
apidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleulsapidays
 
Local Storage for Web Applications
Local Storage for Web ApplicationsLocal Storage for Web Applications
Local Storage for Web ApplicationsMarkku Laine
 
On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...
On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...
On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...Radhika Puthiyetath
 
Mongo and node mongo dc 2011
Mongo and node mongo dc 2011Mongo and node mongo dc 2011
Mongo and node mongo dc 2011async_io
 
Devoxx France 2015 - The Docker Orchestration Ecosystem on Azure
Devoxx France 2015 - The Docker Orchestration Ecosystem on AzureDevoxx France 2015 - The Docker Orchestration Ecosystem on Azure
Devoxx France 2015 - The Docker Orchestration Ecosystem on AzurePatrick Chanezon
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Felix Gessert
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesRobert Lemke
 

Similar to EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Databases (20)

EWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage DatabasesEWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage Databases
 
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
 
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
 
Making Distributed Data Persistent Services Elastic (Without Losing All Your ...
Making Distributed Data Persistent Services Elastic (Without Losing All Your ...Making Distributed Data Persistent Services Elastic (Without Losing All Your ...
Making Distributed Data Persistent Services Elastic (Without Losing All Your ...
 
On Docker and its use for LHC at CERN
On Docker and its use for LHC at CERNOn Docker and its use for LHC at CERN
On Docker and its use for LHC at CERN
 
DRILETT_AWS_VPC_Presentation_2MB
DRILETT_AWS_VPC_Presentation_2MBDRILETT_AWS_VPC_Presentation_2MB
DRILETT_AWS_VPC_Presentation_2MB
 
Always on! ... or not?
Always on! ... or not?Always on! ... or not?
Always on! ... or not?
 
Practical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsPractical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.js
 
Drilett aws vpc_presentation_shared
Drilett aws vpc_presentation_sharedDrilett aws vpc_presentation_shared
Drilett aws vpc_presentation_shared
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetesDeploying windows containers with kubernetes
Deploying windows containers with kubernetes
 
Node.js on Azure
Node.js on AzureNode.js on Azure
Node.js on Azure
 
Introduction to Node (15th May 2017)
Introduction to Node (15th May 2017)Introduction to Node (15th May 2017)
Introduction to Node (15th May 2017)
 
Michael stack -the state of apache h base
Michael stack -the state of apache h baseMichael stack -the state of apache h base
Michael stack -the state of apache h base
 
apidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleuls
apidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleulsapidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleuls
apidays LIVE Paris 2021 - Edge Side APIs by Kevin Dunglas, Les Tilleuls
 
Local Storage for Web Applications
Local Storage for Web ApplicationsLocal Storage for Web Applications
Local Storage for Web Applications
 
On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...
On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...
On CloudStack, Docker, Kubernetes, and Big Data…Oh my ! By Sebastien Goasguen...
 
Mongo and node mongo dc 2011
Mongo and node mongo dc 2011Mongo and node mongo dc 2011
Mongo and node mongo dc 2011
 
Devoxx France 2015 - The Docker Orchestration Ecosystem on Azure
Devoxx France 2015 - The Docker Orchestration Ecosystem on AzureDevoxx France 2015 - The Docker Orchestration Ecosystem on Azure
Devoxx France 2015 - The Docker Orchestration Ecosystem on Azure
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
 
Scaleable PHP Applications in Kubernetes
Scaleable PHP Applications in KubernetesScaleable PHP Applications in Kubernetes
Scaleable PHP Applications in Kubernetes
 

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 FeatureRob 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 TooRob Tweed
 
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityEWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityRob Tweed
 
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.jsEWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.jsRob Tweed
 
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesRob Tweed
 
QEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesQEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesRob 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 TooRob 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 ServicesRob 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 TierRob Tweed
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceRob Tweed
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4Rob Tweed
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3Rob Tweed
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationRob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2Rob Tweed
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...Rob Tweed
 
EWD 3 Training Course Part 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 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingRob Tweed
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeRob Tweed
 

More from Rob Tweed (20)

QEWD Update
QEWD UpdateQEWD Update
QEWD Update
 
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 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 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.jsEWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
 
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
 
QEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesQEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServices
 
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-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
 
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 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 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 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 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 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
 
EWD 3 Training Course Part 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 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 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
 

Recently uploaded

Flutter the Future of Mobile App Development - 5 Crucial Reasons.pdf
Flutter the Future of Mobile App Development - 5 Crucial Reasons.pdfFlutter the Future of Mobile App Development - 5 Crucial Reasons.pdf
Flutter the Future of Mobile App Development - 5 Crucial Reasons.pdfMind IT Systems
 
Mobile App Development company Houston
Mobile  App  Development  company HoustonMobile  App  Development  company Houston
Mobile App Development company Houstonjennysmithusa549
 
VuNet software organisation powerpoint deck
VuNet software organisation powerpoint deckVuNet software organisation powerpoint deck
VuNet software organisation powerpoint deckNaval Singh
 
8 Steps to Build a LangChain RAG Chatbot.
8 Steps to Build a LangChain RAG Chatbot.8 Steps to Build a LangChain RAG Chatbot.
8 Steps to Build a LangChain RAG Chatbot.Ritesh Kanjee
 
Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...
Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...
Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...MyFAA
 
Unlocking AI: Navigating Open Source vs. Commercial Frontiers
Unlocking AI:Navigating Open Source vs. Commercial FrontiersUnlocking AI:Navigating Open Source vs. Commercial Frontiers
Unlocking AI: Navigating Open Source vs. Commercial FrontiersRaphaël Semeteys
 
openEuler Community Overview - a presentation showing the current scale
openEuler Community Overview - a presentation showing the current scaleopenEuler Community Overview - a presentation showing the current scale
openEuler Community Overview - a presentation showing the current scaleShane Coughlan
 
Einstein Copilot Conversational AI for your CRM.pdf
Einstein Copilot Conversational AI for your CRM.pdfEinstein Copilot Conversational AI for your CRM.pdf
Einstein Copilot Conversational AI for your CRM.pdfCloudMetic
 
03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...
03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...
03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...jackiepotts6
 
Unlocking the Power of IoT: A comprehensive approach to real-time insights
Unlocking the Power of IoT: A comprehensive approach to real-time insightsUnlocking the Power of IoT: A comprehensive approach to real-time insights
Unlocking the Power of IoT: A comprehensive approach to real-time insightsconfluent
 
MinionLabs_Mr. Gokul Srinivas_Young Entrepreneur
MinionLabs_Mr. Gokul Srinivas_Young EntrepreneurMinionLabs_Mr. Gokul Srinivas_Young Entrepreneur
MinionLabs_Mr. Gokul Srinivas_Young EntrepreneurPriyadarshini T
 
MUT4SLX: Extensions for Mutation Testing of Stateflow Models
MUT4SLX: Extensions for Mutation Testing of Stateflow ModelsMUT4SLX: Extensions for Mutation Testing of Stateflow Models
MUT4SLX: Extensions for Mutation Testing of Stateflow ModelsUniversity of Antwerp
 
Building Generative AI-infused apps: what's possible and how to start
Building Generative AI-infused apps: what's possible and how to startBuilding Generative AI-infused apps: what's possible and how to start
Building Generative AI-infused apps: what's possible and how to startMaxim Salnikov
 
Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...
Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...
Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...telebusocialmarketin
 
User Experience Designer | Kaylee Miller Resume
User Experience Designer | Kaylee Miller ResumeUser Experience Designer | Kaylee Miller Resume
User Experience Designer | Kaylee Miller ResumeKaylee Miller
 
Technical improvements. Reasons. Methods. Estimations. CJ
Technical improvements.  Reasons. Methods. Estimations. CJTechnical improvements.  Reasons. Methods. Estimations. CJ
Technical improvements. Reasons. Methods. Estimations. CJpolinaucc
 
BATbern52 Swisscom's Journey into Data Mesh
BATbern52 Swisscom's Journey into Data MeshBATbern52 Swisscom's Journey into Data Mesh
BATbern52 Swisscom's Journey into Data MeshBATbern
 
8 key point on optimizing web hosting services in your business.pdf
8 key point on optimizing web hosting services in your business.pdf8 key point on optimizing web hosting services in your business.pdf
8 key point on optimizing web hosting services in your business.pdfOffsiteNOC
 
If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...
If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...
If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...Maxim Salnikov
 

Recently uploaded (20)

Flutter the Future of Mobile App Development - 5 Crucial Reasons.pdf
Flutter the Future of Mobile App Development - 5 Crucial Reasons.pdfFlutter the Future of Mobile App Development - 5 Crucial Reasons.pdf
Flutter the Future of Mobile App Development - 5 Crucial Reasons.pdf
 
Mobile App Development company Houston
Mobile  App  Development  company HoustonMobile  App  Development  company Houston
Mobile App Development company Houston
 
VuNet software organisation powerpoint deck
VuNet software organisation powerpoint deckVuNet software organisation powerpoint deck
VuNet software organisation powerpoint deck
 
8 Steps to Build a LangChain RAG Chatbot.
8 Steps to Build a LangChain RAG Chatbot.8 Steps to Build a LangChain RAG Chatbot.
8 Steps to Build a LangChain RAG Chatbot.
 
Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...
Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...
Take Advantage of Mx Tracking Flight Scheduling Solutions to Streamline Your ...
 
Unlocking AI: Navigating Open Source vs. Commercial Frontiers
Unlocking AI:Navigating Open Source vs. Commercial FrontiersUnlocking AI:Navigating Open Source vs. Commercial Frontiers
Unlocking AI: Navigating Open Source vs. Commercial Frontiers
 
openEuler Community Overview - a presentation showing the current scale
openEuler Community Overview - a presentation showing the current scaleopenEuler Community Overview - a presentation showing the current scale
openEuler Community Overview - a presentation showing the current scale
 
20140812 - OBD2 Solution
20140812 - OBD2 Solution20140812 - OBD2 Solution
20140812 - OBD2 Solution
 
Einstein Copilot Conversational AI for your CRM.pdf
Einstein Copilot Conversational AI for your CRM.pdfEinstein Copilot Conversational AI for your CRM.pdf
Einstein Copilot Conversational AI for your CRM.pdf
 
03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...
03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...
03.2024_North America VMUG Optimizing RevOps using the power of ChatGPT in Ma...
 
Unlocking the Power of IoT: A comprehensive approach to real-time insights
Unlocking the Power of IoT: A comprehensive approach to real-time insightsUnlocking the Power of IoT: A comprehensive approach to real-time insights
Unlocking the Power of IoT: A comprehensive approach to real-time insights
 
MinionLabs_Mr. Gokul Srinivas_Young Entrepreneur
MinionLabs_Mr. Gokul Srinivas_Young EntrepreneurMinionLabs_Mr. Gokul Srinivas_Young Entrepreneur
MinionLabs_Mr. Gokul Srinivas_Young Entrepreneur
 
MUT4SLX: Extensions for Mutation Testing of Stateflow Models
MUT4SLX: Extensions for Mutation Testing of Stateflow ModelsMUT4SLX: Extensions for Mutation Testing of Stateflow Models
MUT4SLX: Extensions for Mutation Testing of Stateflow Models
 
Building Generative AI-infused apps: what's possible and how to start
Building Generative AI-infused apps: what's possible and how to startBuilding Generative AI-infused apps: what's possible and how to start
Building Generative AI-infused apps: what's possible and how to start
 
Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...
Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...
Telebu Social -Whatsapp Business API : Mastering Omnichannel Business Communi...
 
User Experience Designer | Kaylee Miller Resume
User Experience Designer | Kaylee Miller ResumeUser Experience Designer | Kaylee Miller Resume
User Experience Designer | Kaylee Miller Resume
 
Technical improvements. Reasons. Methods. Estimations. CJ
Technical improvements.  Reasons. Methods. Estimations. CJTechnical improvements.  Reasons. Methods. Estimations. CJ
Technical improvements. Reasons. Methods. Estimations. CJ
 
BATbern52 Swisscom's Journey into Data Mesh
BATbern52 Swisscom's Journey into Data MeshBATbern52 Swisscom's Journey into Data Mesh
BATbern52 Swisscom's Journey into Data Mesh
 
8 key point on optimizing web hosting services in your business.pdf
8 key point on optimizing web hosting services in your business.pdf8 key point on optimizing web hosting services in your business.pdf
8 key point on optimizing web hosting services in your business.pdf
 
If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...
If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...
If your code could speak, what would it tell you? Let GitHub Copilot Chat hel...
 

EWD 3 Training Course Part 1: How Node.js Integrates With Global Storage Databases

  • 1. Copyright © 2016 M/Gateway Developments Ltd EWD 3 Training Course Part 1 How Node.js Integrates with Global Storage Databases Rob Tweed Director, M/Gateway Developments Ltd Twitter: @rtweed
  • 2. Copyright © 2016 M/Gateway Developments Ltd Global Storage Databases • InterSystems Caché – Proprietary, commercially-licensed – Windows, Linux, OS X – http://www.intersystems.com/our-products/cache/cache-overview/ • FIS GT.M – Free, Open Source – Linux – https://www.fisglobal.com/Solutions/Banking-and-Wealth/Services/Database-Engine • Redis, via ewd-redis-globals – https://github.com/robtweed/ewd-redis-globals
  • 3. Copyright © 2016 M/Gateway Developments Ltd Node.js • Node.js: – Server-side JavaScript – Single thread of execution – JavaScript is the world's most popular computer language, by a considerable (and growing) margin
  • 4. Copyright © 2016 M/Gateway Developments Ltd Caché • High-performance multi-model NoSQL database – Hierarchical underlying data structure • "Global Storage" • Normally accessed via built-in language – Cache ObjectScript • Extension/ super-set of MUMPS language – Considered obsolete by IT mainstream
  • 5. Copyright © 2016 M/Gateway Developments Ltd GT.M • High-performance multi-model NoSQL database – Hierarchical underlying data structure • "Global Storage" – Normally accessed via built-in language • MUMPS • Considered obsolete by IT mainstream
  • 6. Copyright © 2016 M/Gateway Developments Ltd Redis / ewd-redis-globals • Redis: – Probably the world's most popular Open Source NoSQL databases – Also one of the fastest – Key/Value storage primitive data structures • ewd-redis-globals: – Global storage functionality implemented on top of Redis database key/value primitives – Database only • No dependency on Mumps language • Open source equivalent to InterSystems' GlobalsDB
  • 7. Copyright © 2016 M/Gateway Developments Ltd Making Global Storage mainstream • Global Storage has proven to be a very powerful, flexible, high-performance NoSQL database model for real-world, demanding applications • It has been ignored by the mainstream by virtue of its integrated access language being seen as out-dated / obsolete – "database baby has been thrown out with the language bathwater" • JavaScript as a primary language for accessing Global Storage databases?
  • 8. Copyright © 2016 M/Gateway Developments Ltd Node.js Interface • Actually first implemented for free (but not Open Source) GlobalsDB database – Core engine from Caché – No language parser/engine – Now deprecated by InterSystems • Accessed via the database engine's C++ call-in interface – Originally Java & .Net only • Node.js interface developed by Chris Munt • Interface module file: cache.node
  • 9. Copyright © 2016 M/Gateway Developments Ltd Node.js Interface • cache.node ported to Cache • function() API added to allow MUMPS/Cache Objectscript code to be executed from JavaScript / Node.js • Cache Object APIs also subsequently added • Network (TCP-based) interface is also available
  • 10. Copyright © 2016 M/Gateway Developments Ltd cache.node interface Node.js Process Caché Process cache.node module C++call-ininterface JavaScript Globals Functions Objects
  • 11. Copyright © 2016 M/Gateway Developments Ltd GT.M / NodeM • cache.node APIs re-implemented by Open Source community (David Wicksell) for use with GT.M – https://github.com/dlwicksell/nodem – Interfaces with GT.M's C Call-in interface
  • 12. Copyright © 2016 M/Gateway Developments Ltd NodeM interface Node.js Process GT.M Process NodeM module Ccall-ininterface JavaScript Globals Functions
  • 13. Copyright © 2016 M/Gateway Developments Ltd Redis / ewd-redis-globals • cache.node APIs re-implemented as part of the ewd-redis-globals module – Interfaces with Redis via its standard TCP connection
  • 14. Copyright © 2016 M/Gateway Developments Ltd In-process Node.js Interfaces to Cache & GT.M • Very closely-coupled, intimate relationship between Node.js and Caché / GT.M – In-process • The Node.js process and connected Caché / GT.M process are one and the same – Node.js process.pid === Caché/GT.M $job – Node.js must be installed on the Caché or GT.M server
  • 15. Copyright © 2016 M/Gateway Developments Ltd cache.node interface cache.node module C++call-ininterface JavaScript Globals Functions Objects CachéNode.jsProcess
  • 16. Copyright © 2016 M/Gateway Developments Ltd In-process Node.js Interface • Very fast connection – Significantly faster than a networked connection between Node.js and Caché – Currently between ⅓ and ¼ the performance of native Mumps code when accessing Global storage – Currently limited by Google V8 API bottleneck • https://bugs.chromium.org/p/v8/issues/detail?id=5144 • Potential for full native Mumps performance
  • 17. Copyright © 2016 M/Gateway Developments Ltd Networked interfaces • Available for Caché and Redis/ewd-redis-globals • Allows database and Node.js to be on different physical servers • Trade-off between performance and flexibility / redundancy
  • 18. Copyright © 2016 M/Gateway Developments Ltd JavaScript access to Global Storage • The JavaScript / Node.js APIs for accessing Global storage are identical, regardless of database type and connection type • Defined by the original cache.node APIs • http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS
  • 19. Copyright © 2016 M/Gateway Developments Ltd Installing cache.node • Currently included with Cache build kits – Not distributed separately – Hoping that InterSystems will soon distribute via NPM • Different Node.js versions have introduced API changes – Different versions of cache.node for each main Node.js version • 12.x – cache0120.node • 4.1.x – cache410.node • 4.2 and later 4.x versions – Cache421.node – Rename to cache.node and copy to main node_modules directory • Eg C:ewd3node_modulescache.node
  • 20. Copyright © 2016 M/Gateway Developments Ltd Installing NodeM for GT.M • Node.js Add-in module • See: – https://github.com/dlwicksell/nodem
  • 21. Copyright © 2016 M/Gateway Developments Ltd ewd-redis-globals • Assumes you have Redis installed • ewd-redis-globals: – Node.js module • https://github.com/robtweed/ewd-redis-globals – Implements Global Storage functionality using Redis primitive data structures – Provides the JavaScript APIs for accessing Global Storage • Complies with the cache.node API definitions
  • 22. Copyright © 2016 M/Gateway Developments Ltd Connecting to Caché var interface = require('cache'); // loads cache.node var db = new interface.Cache(); // Change these parameters to match your Cache system: var ok = db.open({ path: '/opt/cache/mgr', username: '_SYSTEM', password: 'SYS', namespace: 'USER' }); // confirm it connected OK console.log('ok: ' + JSON.stringify(ok)); console.log(db.version()); Create a test Script file, eg C:ewd3test.js
  • 23. Copyright © 2016 M/Gateway Developments Ltd Connecting to GT.M var interface = require('nodem'); // loads NodeM var db = new interface.Gtm(); // Assuming your process profile is automatically configured // for GT.M: var ok = db.open(); // confirm it connected OK console.log('ok: ' + JSON.stringify(ok)); console.log(db.version()); // once connected, the APIs for GT.M are identical to // those for Cache Create a test Script file, eg C:ewd3test.js
  • 24. Copyright © 2016 M/Gateway Developments Ltd Connecting to Redis var interface = require('ewd-redis-globals'); var db = new interface(); // Assuming Redis is listening on standard port and // running on localhost: var ok = db.open(); // confirm it connected OK console.log('ok: ' + JSON.stringify(ok)); console.log(db.version()); // once connected, the APIs for Redis are identical to // those for Cache Create a test Script file, eg C:ewd3test.js
  • 25. Copyright © 2016 M/Gateway Developments Ltd Connecting to Global Storage Run the test script file: cd ewd3 node test ok: {"ok":1,"result":1} Node.js Adaptor for Cache: Version: 1.1.104 (CM); Cache Version: 2015.2 build 664 Connection is working! The version string will be different for GT.M or ewd-redis-globals
  • 26. Copyright © 2016 M/Gateway Developments Ltd Simple examples • Set a Global Node, eg – set ^test("foo","bar")="hello world" var node = { global: 'test', subscripts: ['foo', 'bar'], data: 'hello world' }; db.set(node, function(error, result) { // do something when node is created });
  • 27. Copyright © 2016 M/Gateway Developments Ltd Simple examples • Get a Global Node, eg – Set value = ^test("foo","bar") var node = { global: 'test', subscripts: ['foo', 'bar'] }; db.get(node, function(error, result) { console.log('value = ' + result.data); });
  • 28. Copyright © 2016 M/Gateway Developments Ltd cache.node APIs • Open and close database • Set, get, kill a global node • Determine if a node is defined ($data) • Equivalents to $order and $query (forwards and backwards) • Global directory listing • Increment a global node • Lock/unlock a global node • Merge one global sub-tree into another
  • 29. Copyright © 2016 M/Gateway Developments Ltd cache.node API Documentation • http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS_refapi
  • 30. Copyright © 2016 M/Gateway Developments Ltd cache.node also has APIs for Caché Objects • invoke_classmethod – invoke a class method • create_instance – create a new instance of an object • open_instance – open an existing instance of an object • get_property – retrieve the value of a property • set_property – set the value of a property • invoke_method – invoke a method • save_instance – save an instance • close_instance – close an instance • Note: these are ONLY available for Caché!
  • 31. Copyright © 2016 M/Gateway Developments Ltd cache.node APIs • On all platforms, available as asynchronous & synchronous versions – If using a single Node.js process for multi-user access, you must use the async APIs – Synchronous APIs: • Slightly faster • Simpler and more intuitive to use – Avoid call-back hell or use of Promises etc • Allow higher-level database abstractions to be created on top of the basic global storage primitives – Multi-model NoSQL functionality via JavaScript • Allow for "embedded" database functionality in Node.js
  • 32. Copyright © 2016 M/Gateway Developments Ltd Synchronous cache.node APIs • Normal limitations of synchronous APIs: – They block I/O, so have disastrous results on Node.js concurrency performance – So, not normally usable with Node.js except for single-user testing • However, new run-time environments for Node.js that provide an isolated run-time container for a handler function can safely use synchronous APIs, eg: – AWS Lambda – QEWD (previously known as ewd-xpress)