Wie kann eine Anfrage beim Senden einer Anfrage an NodeJS gelöscht werden?

Wie kann eine Anfrage beim Senden einer Anfrage an NodeJS gelöscht werden?

Ich habe einen AWS ALB, der die Last der Anfragen im Round-Robin-Verfahren auf vier Server verteilt.

Jeder Server verwendet pm2, um diese Anfragen im Round-Robin-Verfahren an sechs CPUs weiterzuleiten.

Auf jeder dieser sechs CPUs laufen NodeJS-Prozesse (React NextJS), die von Express.js bedient werden. Eine der ersten Aufgaben, die sie ausführen, ist das Protokollieren der eingehenden Anfrage. (Sie werden nicht von einem Webserver wie Apache oder Nginx gesteuert, sondern gehen direkt an Express.js.)

Normalerweise wird jede einzelne Anfrage, die den ALB erreicht, erfolgreich weitergeleitet und vom NodeJS-Prozess protokolliert. Manchmal werden jedoch zu Zeiten mit hohem Datenverkehr einige Anfragen einfach gelöscht und erreichen nie den NodeJS-Prozess. Unsere Serverprotokolle protokollieren diese Fehler natürlich nicht, da sie dort von vornherein nie ankommen; wir sehen diese Lücke nur, wenn wir sie mit den ALB-Anforderungszahlen vergleichen.

Ich versuche, den Mechanismus zu verstehen, der dazu führen könnte, dass sie gelöscht werden. Könnte es sein, dass eine interne NodeJS-Warteschlange abläuft? Oder könnte es etwas mit dem Linux-Kernel zu tun haben? Wir sehen Anzeichen dafür, dass in Zeiten mit höherem Datenverkehr einige der CPUs ausgelastet sind, während andere im Leerlauf sind, was mich an die Warteschlangenlänge denken lässt (Kingmans Formel, Littles Gesetz usw.). Mir fallen einige Möglichkeiten ein, die Wahrscheinlichkeit dafür zu verringern, dass dies passiert, von der Erhöhung der Serverkapazität über die Reduzierung der Antwortzeit bis hin zur Änderung der Lastausgleichsstrategie auf Serverebene, aber ich versuche eher zu verstehen, wo die Anfrage tatsächlich hängen bleibt und was bestimmt, ob und wie sie gelöscht/verschwindet – insbesondere, ob ich sie protokollieren oder eine Art Signal senden könnte, wenn es passiert.

Ausschnitte der pm2-Konfiguration:

module.exports = {
  apps: [
    {
      name: 'community',
      script: 'dist/server.js',
      instances: -1,
      exec_mode: 'cluster',
      autorestart: true,
      watch: false,
      log_date_format: 'YYYY-MM-DD HH:mm Z',
      max_memory_restart: '2G',
// ...
// and env-specific configs, such as
      env_production: {
        NODE_ENV: 'production',
        NODE_OPTIONS: '--max-old-space-size=3584 --max-http-header-size=16380',
        LOG_LEVEL: 'INFO',
        PORT: 3000,
      },
    },
  ],
  deploy: {
// ...
  },
};

verwandte Informationen