Как запрос может быть потерян при отправке запроса в NodeJS?

Как запрос может быть потерян при отправке запроса в NodeJS?

У меня есть AWS ALB, который распределяет нагрузку между запросами по кругу на четыре сервера.

Каждый сервер использует pm2 для циклического распределения этих запросов по шести ЦП.

Процессы NodeJS (react NextJS) работают на каждом из этих шести ЦП, обслуживаемых Express.js. Одно из первых действий, которое они выполняют, — это регистрация входящего запроса. (Они не имеют веб-сервера, такого как Apache или Nginx, он напрямую идет в Express.js.)

Обычно каждый отдельный запрос, который попадает в ALB, успешно пересылается и регистрируется процессом NodeJS. Однако иногда в моменты большого трафика некоторые запросы просто отбрасываются и никогда не попадают в процесс NodeJS. Очевидно, что наши серверные журналы не регистрируют эти сбои, поскольку они никогда не попадают туда изначально; мы видим этот разрыв только путем сравнения с количеством запросов ALB.

Я пытаюсь понять механизм, который может привести к их потере. Может ли это быть из-за тайм-аута внутренней очереди NodeJS? Или это может быть особенностью ядра Linux? Мы видим признаки того, что в периоды повышенного трафика некоторые процессоры заняты, а другие простаивают, что заставляет меня думать о длине очереди (формула Кингмана, закон Литтла и т. д.). Я могу придумать несколько способов уменьшить вероятность этого: от увеличения емкости сервера до сокращения времени отклика и изменения стратегии балансировки нагрузки на уровне сервера, но я больше пытаюсь понять, где на самом деле застревает запрос и что определяет, теряется ли он/исчезает и как — особенно если бы я мог регистрировать это или отправлять какой-то сигнал, когда это происходит.

Фрагменты конфигурации 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: {
// ...
  },
};

Связанный контент