Am un AWS ALB care echilibrează sarcina cererilor round-robin la patru servere.
Fiecare server folosește pm2 pentru a combina acele cereri la șase procesoare.
Procesele NodeJS (react NextJS) rulează pe fiecare dintre aceste șase procesoare, deservite de Express.js. Unul dintre primele lucruri pe care le fac este să înregistreze cererea primită. (Nu au un server web precum apache sau nginx, ci merge direct la Express.js.)
De obicei, fiecare cerere care atinge ALB este redirecționată cu succes și înregistrată de procesul NodeJS. Cu toate acestea, uneori, la orele de trafic ridicat, unele solicitări sunt abandonate și nu ajung niciodată la procesul NodeJS. Evident, jurnalele serverului nostru nu înregistrează aceste erori, deoarece nu ajung niciodată acolo; vedem acest decalaj doar prin compararea cu numărul de cereri ALB.
Încerc să înțeleg mecanismul care ar putea duce la abandonarea lor. Este posibil ca o coadă internă NodeJS să expire? Sau ar putea fi o chestie cu nucleul linux? Observăm indicii că, în perioadele de trafic mai mare, unele dintre procesoare sunt ocupate, în timp ce altele sunt inactive, ceea ce mă face să mă gândesc la lungimea cozii (formula Kingmans, legea lui Little, etc). Mă gândesc la câteva modalități de a reduce probabilitatea ca acest lucru să se întâmple, de la creșterea capacității serverului, la reducerea timpului de răspuns, la schimbarea strategiei de echilibrare a sarcinii la nivel de server, dar încerc mai mult să înțeleg unde cererea se blochează de fapt și ceea ce determină dacă și cum scade/dispare - mai ales dacă aș putea să-l înregistrez sau să trimit un fel de semnal atunci când se întâmplă.
Fragmente din configurația pm2:
module.exports = {
aplicații: [
{
nume: „comunitate”,
script: „dist/server.js”,
cazuri: -1,
exec_mode: „cluster”,
pornire automată: adevărat,
ceas: fals,
log_date_format: „AAAA-LL-ZZ HH:mm Z”,
max_memory_restart: „2G”,
// ...
// și configurații specifice env, cum ar fi
env_production: {
NODE_ENV: „producție”,
NODE_OPTIONS: '--max-old-space-size=3584 --max-http-header-size=16380',
LOG_LEVEL: „INFO”,
PORT: 3000,
},
},
],
implementează: {
// ...
},
};