优化 Amazon ECS 的负载均衡器连接耗尽参数
为了便于优化,客户端会保持与容器服务的活动连接。这样,来自该客户端的后续请求就可以重复使用现有连接。当您想停止流向容器的流量时,可以通知负载均衡器。负载均衡器会定期检查客户端是否关闭了保持活动连接。Amazon ECS 代理监控负载均衡器,并等待负载均衡器报告保持活动连接已关闭的情况(目标处于 UNUSED
状态)。
负载均衡器等待将目标移至 UNUSED
状态的时间为取消注册延迟。您可以配置以下负载均衡器参数来加快部署速度。
-
deregistration_delay.timeout_seconds
:300(默认值)
当您的服务响应时间小于 1 秒时,请将参数设置为以下值,使负载均衡器在中断客户端和后端服务之间的连接之前只等待 5 秒:
-
deregistration_delay.timeout_seconds
:5
注意
当您的服务具有长期请求(例如文件上传缓慢或流式传输连接)时,请勿将该值设置为 5 秒。
SIGTERM 响应能力
Amazon ECS 首先向任务发送 SIGTERM 信号通知应用程序需要完成并关闭。然后,Amazon ECS 会发送一条 SIGKILL 消息。当应用程序忽略 SIGTERM 时,Amazon ECS 服务必须等待发送终止该进程的 SIGKILL 信号。
Amazon ECS 等待发送 SIGKILL 消息的时间由以下 Amazon ECS 代理选项确定:
-
ECS_CONTAINER_STOP_TIMEOUT
:30(默认值)有关容器代理参数的更多信息,请参阅 GitHub 上的 Amazon ECS 容器代理
。
要加快等待时间,请将 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。