Skip to content

Les étapes de la démonstration

Pour la réalisation de cette démonstration, nous allons suivre les étapes suivantes :

  1. Créer un server HTTP qui va écouter un port fixé par variable d'env
  2. Créer notre cluster qui devra créer et gérer les processus enfants
  3. Lancer un scénario de test pour vérifier le comportement de notre cluster
  4. 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