本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
針對 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。