向 NodeJS 发送请求时怎么会被丢弃?

向 NodeJS 发送请求时怎么会被丢弃?

我有一个 AWS ALB,它可以将负载平衡请求循环发送到四台服务器。

每个服务器使用 pm2 将这些请求循环分发给六个 CPU。

NodeJS 进程(react NextJS)在 Express.js 提供的六个 CPU 上运行。它们所做的第一件事就是记录传入的请求。(它们不是由 apache 或 nginx 等 Web 服务器负责,而是直接转到 Express.js。)

通常,到达 ALB 的每个请求都会成功转发,并由 NodeJS 进程记录。但是,有时在流量高峰期,某些请求会被丢弃,永远不会到达 NodeJS 进程。显然,我们的服务器日志不会记录这些失败,因为它们从一开始就不会到达那里;我们只能通过与 ALB 请求计数进行比较来看到这一差距。

我正在尝试了解可能导致它们被丢弃的机制。可能是 NodeJS 内部队列超时了吗?或者可能是 Linux 内核的问题?我们看到迹象表明,在流量较高期间,一些 CPU 处于繁忙状态,而其他 CPU 处于空闲状态,这让我想到了队列长度(金曼公式、利特尔定律等)。我可以想到几种降低这种情况发生概率的方法,从增加服务器容量到减少响应时间,再到更改服务器级负载平衡策略,但我更想了解请求实际上卡在哪里,以及决定它是否以及如何丢弃/消失的因素 - 特别是如果我可以记录它或在发生时发送某种信号。

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

相关内容