Les étapes de la démonstration
Pour la réalisation de cette démonstration, nous allons suivre les étapes suivantes :
- Créer un server HTTP qui va écouter un port fixé par variable d'env
- Créer notre cluster qui devra créer et gérer les processus enfants
- Lancer un scénario de test pour vérifier le comportement de notre cluster
- Corriger notre Cluster pour améliorer sa résilience
Voici les différents fichiers pertinents de la démo :
js
import process from 'node:process'
import {Server} from './utils/Server.js'
import {logger} from './utils/logger.js'
function random () {
return Math.floor(Math.random() * 50)
}
const numbers = [
random(),
random(),
random(),
random()
]
export default new Server()
.get('/', async (ctx) => {
if (numbers.includes(random())) {
process.exit(-1)
}
return {
id: ctx.id,
message: 'Hello World',
pid: process.pid
}
})
.listen(process.env.PORT)
.then((address) => {
logger.info(`Server started and listening on http://${address.address}:${address.port}`)
})
js
import {join} from 'node:path'
import cluster from 'node:cluster'
import {availableParallelism} from 'node:os'
import {logger} from './utils/logger.js'
const numCPUs = availableParallelism()
const [, , script] = process.argv
if (cluster.isPrimary) {
// master process
// Init workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
cluster.on('exit', (worker, code, signal) => {
logger.fatal({
event: 'worker.exit',
pid: worker.process.pid,
code,
signal,
message: `Worker ${worker.process.pid} died`
})
})
logger.info({
event: 'cluster.master.start',
message: `Master is running`,
available_cpu: numCPUs
})
} else {
import(join(process.cwd(), script))
}
yml
config:
# This is a test server run by team Artillery
# It's designed to be highly scalable
target: http://localhost:8091
phases:
- duration: 30
arrivalRate: 10
name: Sustained peak load
# Load & configure a couple of useful plugins
# https://docs.art/reference/extensions
plugins:
ensure: {}
apdex: {}
metrics-by-endpoint: {}
apdex:
threshold: 100
ensure:
thresholds:
- http.response_time.p99: 100
- http.response_time.p95: 75
scenarios:
- flow:
- loop:
- get:
url: "/"
count: 2
Voir le code complet
Usage
sh
cd packages/cluster
yarn start
yarn test