向 NodeJS 發送請求時,請求怎麼會被丟棄?

向 NodeJS 發送請求時,請求怎麼會被丟棄?

我有一個 AWS ALB,可以將請求循環負載平衡到四台伺服器。

每個伺服器使用 pm2 將這些請求輪詢到六個 CPU。

NodeJS 程序 (react NextJS) 分別在這六個 CPU 上運行,由 Express.js 提供服務。他們做的第一件事就是記錄傳入的請求。 (它們的前端不是像 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: {
// ...
  },
};

相關內容