針對 Amazon ECS 最佳化負載平衡器連接耗盡參數 - Amazon Elastic Container Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

針對 Amazon ECS 最佳化負載平衡器連接耗盡參數

為了實現最佳化,用戶端會維持與容器服務的持續連線。這允許該用戶端的後續請求重複使用現有連線。若要停止流向容器的流量,需要通知負載平衡器。負載平衡器會定期檢查用戶端是否關閉持續連線。Amazon ECS 會監控負載平衡器,並等待負載平衡器報告持續連線已關閉 (目標處於 UNUSED 狀態)。

負載平衡器等待將目標移至 UNUSED 狀態的時間即為取消註冊延遲。您可以設定下列負載平衡器參數來加速部署。

  • deregistration_delay.timeout_seconds:300 (預設值)

如果服務回應時間低於 1 秒,請將參數設定為下列值,使負載平衡器僅等待 5 秒就中斷用戶端與後端服務之間的連線:

  • deregistration_delay.timeout_seconds:5

注意

如果服務涉及長效請求(例如慢速檔案上傳或串流連線),請勿將此值設定為 5 秒。

SIGTERM 回應能力

Amazon ECS 會先傳送停止訊號給任務,以通知應用程式需要完成並關閉。此訊號可以使用 STOPSIGNAL 指令在您的容器映像中定義,並預設為 SIGTERM。然後,Amazon ECS 會傳送 SIGKILL 訊息。當應用程式忽略 SIGTERM 時,Amazon ECS 服務必須等待一段時間才能傳送 SIGKILL 訊號來終止程序。

Amazon ECS 等待傳送 SIGKILL 訊息的時間取決於下列 Amazon ECS 代理程式選項:

  • ECS_CONTAINER_STOP_TIMEOUT:30 (預設值)

    如需有關容器代理程式參數的詳細資訊,請參閱 GitHub 上的 Amazon ECS Container Agent

若要縮短等待期間,請將 Amazon ECS 代理程式參數設定為下列值:

  • ECS_CONTAINER_STOP_TIMEOUT: 2

    如果應用程式需要超過 1 秒的時間,請將該值乘以 2,並將該數字用作設定值。

在這種情況下,Amazon ECS 會等待 2 秒讓容器關閉,如果應用程式沒有停止,Amazon ECS 會傳送 SIGKILL 訊息。

您也可以修改應用程式程式碼來捕捉 SIGTERM 訊號並對其作出反應。以下是 JavaScript 中的範例:

process.on('SIGTERM', function() { server.close(); })

此程式碼會導致 HTTP 伺服器停止監聽任何新請求、完成回應所有傳輸中請求,然後 Node.js 程序會終止,因為事件迴圈沒有執行任何動作。有鑑於此,如果程序僅需 500 毫秒就能完成其傳輸中請求,它就會提早終止,而無需等待停止逾時並收到 SIGKILL。