Como uma solicitação poderia ser descartada ao enviar uma solicitação ao NodeJS?

Como uma solicitação poderia ser descartada ao enviar uma solicitação ao NodeJS?

Eu tenho um AWS ALB que balanceia a carga de solicitações round-robin para quatro servidores.

Cada servidor usa pm2 para fazer round-robin dessas solicitações para seis CPUs.

Os processos NodeJS (react NextJS) estão sendo executados em cada uma dessas seis CPUs, atendidas pelo Express.js. Uma das primeiras coisas que fazem é registrar a solicitação recebida. (Eles não são gerenciados por um servidor web como Apache ou nginx, eles vão direto para Express.js.)

Normalmente, cada solicitação que chega ao ALB é encaminhada com sucesso e registrada pelo processo NodeJS. No entanto, às vezes, em momentos de alto tráfego, algumas solicitações simplesmente são descartadas e nunca chegam ao processo NodeJS. Obviamente, os logs do nosso servidor não registram essas falhas, pois elas nunca chegam lá; só vemos essa lacuna comparando com as contagens de solicitações ALB.

Estou tentando entender o mecanismo que pode levar à sua queda. Será que uma fila interna do NodeJS expirou? Ou poderia ser uma coisa do kernel do Linux? Estamos vendo indicações de que durante períodos de maior tráfego, algumas CPUs estão ocupadas enquanto outras estão ociosas, o que me faz pensar no comprimento da fila (fórmula de Kingman, lei de Little, etc.). Posso pensar em algumas maneiras de diminuir a probabilidade de isso acontecer, desde aumentar a capacidade do servidor, reduzir o tempo de resposta, até alterar a estratégia de balanceamento de carga no nível do servidor, mas estou mais tentando entender onde a solicitação realmente fica presa e o que determina se e como ele cai/desaparece - especialmente se eu pudesse registrá-lo ou enviar algum tipo de sinal quando isso acontecer.

Trechos da configuração do pm2:

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: {
// ...
  },
};

informação relacionada