Weitere ähnliche Inhalte Ähnlich wie Node Interactive: Node.js Performance and Highly Scalable Micro-Services (20) Mehr von Chris Bailey (20) Kürzlich hochgeladen (20) Node Interactive: Node.js Performance and Highly Scalable Micro-Services20. Startup
• Availability
• Scaling
Memory
• Efficiency
• Cost
50,42052,640
42,500
71,000
3,049
2,914
2,076
1,866
4.x master6.x 8.x 4.x master6.x 8.x
Benchmarking WG: Performance Gains
IO Speed
• Performance
• Scale
21. Startup
• Availability
• Scaling
Memory
• Efficiency
• Cost
50,42052,640
42,500
71,000
89,024
92,84091,47688,9603,049
2,914
2,076
1,866
4.x master6.x 8.x 4.x master6.x 8.x 4.x master6.x 8.x
Benchmarking WG: Performance Gains
IO Speed
• Performance
• Scale
23. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
24. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
const appName = require('./../package').name;
const express = require('express');
const log4js = require(‘log4js');
const logger = log4js.getLogger(appName);
const app = express();
app.get('/', function (req, res) {
res.send('Hello World!')
})
const port = process.env.PORT || 3000;
app.listen(port, function(){
logger.info(`Express listening on: ` + port);
});
25. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
26. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
FROM ibmcom/ibmnode
ENV NODE_ENV production
ENV PORT 3000
WORKDIR "/app"
# Install app dependencies
COPY package.json /app/
RUN cd /app; npm install
# Bundle app source
COPY . /app
EXPOSE 3000
CMD ["npm", "start"]
27. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
node_modules/
npm-debug.log
29. $ docker build -t <your username>/node-app .
$ docker run -p 49160:3000 -d <your username>/node-app
30. $ docker build -t <your username>/node-app .
$ docker run -p 49160:3000 -d <your username>/node-app
31. $ docker build -t <your username>/node-app .
$ docker run -p 49160:3000 -d <your username>/node-app
32. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
chart/node-app/Chart.yaml
chart/node-app/templates/deployment.yaml
chart/node-app/templates/hpa.yaml
chart/node-app/templates/service.yaml
chart/node-app/values.yaml
HELM CHARTS
33. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
chart/node-app/Chart.yaml
chart/node-app/templates/deployment.yaml
chart/node-app/templates/hpa.yaml
chart/node-app/templates/service.yaml
chart/node-app/values.yaml
HELM CHARTS
apiVersion: v1
description: A Helm chart for Kubernetes
name: node-app
version: 1.0.0
34. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
chart/node-app/Chart.yaml
chart/node-app/templates/deployment.yaml
chart/node-app/templates/hpa.yaml
chart/node-app/templates/service.yaml
chart/node-app/values.yaml
HELM CHARTS
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: “node-app-deployment"
labels:
chart: “node-app-1.0.0”
spec:
replicas: “5”
revisionHistoryLimit: “1”
template:
metadata:
labels:
app: “node-app-selector"
version: “1.0.0”
spec:
containers:
- name: “node-app”
image: “repository:1.0.0”
imagePullPolicy: Always
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 3000
periodSeconds: 1000
resources:
requests:
cpu: "200m"
memory: "300Mi"
env:
- name: PORT
value : “3000”
35. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
chart/node-app/Chart.yaml
chart/node-app/templates/deployment.yaml
chart/node-app/templates/hpa.yaml
chart/node-app/templates/service.yaml
chart/node-app/values.yaml
HELM CHARTS
apiVersion: autoscaling/v2alpha1
kind: HorizontalPodAutoscaler
metadata:
name: “node-app-hpa-policy"
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1beta1
kind: Deployment
name: “node-app-deployment"
minReplicas: 5
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 70
- type: Resource
resource:
name: memory
targetAverageUtilization: 70
36. func add(_ a: Int,
to b: Int) -> Void
{
print(a + b)
}
let a = ”5”
let b = 3
public/*
test/*
server/server.js
package.json
README.md
.gitignore
Dockerfile
Dockerfile-tools
.dockerignore
chart/node-app/Chart.yaml
chart/node-app/templates/deployment.yaml
chart/node-app/templates/hpa.yaml
chart/node-app/templates/service.yaml
chart/node-app/values.yaml
HELM CHARTS
apiVersion: v1
kind: Service
metadata:
name: “node-app“
labels:
chart: “node-app-1.0.0”
spec:
type: NodePort
ports:
- port: 3000
selector:
app: “node-app-selector"
38. $ helm package ./chart/node-app
$ helm install ./node-app-1.0.0.tgz
39. $ helm package ./chart/node-app
$ helm install ./node-app-1.0.0.tgz
40. $ helm package ./chart/node-app
$ helm install ./node-app-1.0.0.tgz
42. PUBLIC NETWORK CLOUD NETWORK
CATALOG
ORDER
INVENTORY
USER
MySQL
MongoDB
SPARK
ELASTICSEARCH
BACKEND FOR
FRONTEND
MICROSERVICES SERVICES
LOAD
BALANCER
43. PUBLIC NETWORK CLOUD NETWORK
CATALOG
ORDER
INVENTORY
USER
MySQL
MongoDB
SPARK
ELASTICSEARCH
BACKEND FOR
FRONTEND
MICROSERVICES SERVICES
LOAD
BALANCER
44. PUBLIC NETWORK CLOUD NETWORK
CATALOG
ORDER
INVENTORY
USER
MySQL
MongoDB
SPARK
ELASTICSEARCH
BACKEND FOR
FRONTEND
MICROSERVICES SERVICES
LOAD
BALANCER
45. PUBLIC NETWORK CLOUD NETWORK
CATALOG
ORDER
INVENTORY
USER
MySQL
MongoDB
SPARK
ELASTICSEARCH
BACKEND FOR
FRONTEND
MICROSERVICES SERVICES
LOAD
BALANCER
46. PUBLIC NETWORK CLOUD NETWORK
CATALOG
ORDER
INVENTORY
USER
MySQL
MongoDB
SPARK
ELASTICSEARCH
BACKEND FOR
FRONTEND
MICROSERVICES SERVICES
LOAD
BALANCER
47. PUBLIC NETWORK CLOUD NETWORK
CATALOG
ORDER
INVENTORY
USER
MySQL
MongoDB
SPARK
ELASTICSEARCH
BACKEND FOR
FRONTEND
MICROSERVICES SERVICES
LOAD
BALANCER
48. PUBLIC NETWORK CLOUD NETWORK
CATALOG
ORDER
INVENTORY
USER
MySQL
MongoDB
SPARK
ELASTICSEARCH
BACKEND FOR
FRONTEND
MICROSERVICES SERVICES
LOAD
BALANCER
57. • Collects data from each enabled service
• Propagates correlation ID using HTTP headers
• Provides sampling, tracing, and debug capabilities
• Collects microsecond timestamps
• Correlates data in Zipkin server
• Presents data in Zipkin dashboard
Request Tracking: OpenTracing and Zipkin
58. const zipkin = require(‘appmetrics-zipkin’);
const rest = require(‘rest');
const express = require('express');
const app = express();
app.get('/', (req, res) => {
rest('http://localhost:9000/api')
.then(response => res.send(response.entity))
.catch(err => console.error('Error', err.stack));
});
const port = process.env.PORT || 3000;
app.listen(port, function(){
logger.info(`Express listening on: ` + port);
});
60. • Collects data from each enabled service
• Requires /metrics endpoint providing data
• Provides storage and correlation capabilities
• Provide customisable dashboard
• Integrates with Graphana, Graphite, etc
Microservice Metrics: Prometheus
61. const zipkin = require(‘appmetrics-zipkin’);
const prometheus = require(‘appmetrics-prometheus’).attach();
const rest = require(‘rest');
const express = require('express');
const app = express();
app.get('/', (req, res) => {
rest('http://localhost:9000/api')
.then(response => res.send(response.entity))
.catch(err => console.error('Error', err.stack));
});
const port = process.env.PORT || 3000;
app.listen(port, function(){
logger.info(`Express listening on: ` + port);
});
64. • ‘appmetrics-dash’ provides self-hosted monitoring
• Inbound and Outbound request performance
• Resource and event loop monitoring
• Request a node-report
• Enable profiling and flame graphs
Deep Analysis: ‘appmetrics-dash’ and Flame Graphs
65. const zipkin = require(‘appmetrics-zipkin’);
const prometheus = require(‘appmetrics-prometheus’).attach();
const dash = require(‘appmetrics-dash’).attach();
const rest = require(‘rest');
const express = require('express');
const app = express();
app.get('/', (req, res) => {
rest('http://localhost:9000/api')
.then(response => res.send(response.entity))
.catch(err => console.error('Error', err.stack));
});
const port = process.env.PORT || 3000;
app.listen(port, function(){
logger.info(`Express listening on: ` + port);
});
‘appmetrics-dash’
70. const rest = require(‘rest');
const express = require('express');
const CLSContext = require('zipkin-context-cls');
const {Tracer} = require('zipkin');
const {recorder} = require('./recorder');
const ctxImpl = new CLSContext('zipkin');
const tracer = new Tracer({ctxImpl, recorder});
const app = express();
const zipkinMiddleware = require('zipkin-instrumentation-express').expressMiddleware;
app.use(zipkinMiddleware({tracer, serviceName: 'frontend'}));
const {restInterceptor} = require('zipkin-instrumentation-cujojs-rest');
const zipkinRest = rest.wrap(restInterceptor, {tracer, remoteServiceName: ‘backend'});
app.get('/', (req, res) => {
zipkinRest('http://localhost:9000/api')
.then(response => res.send(response.entity))
.catch(err => console.error('Error', err.stack));
});