AWS ECS更新ECS服务时的WebSocket连接排空问题

3
我正在使用AWS ECS来运行基于nodejs编写的聊天应用程序,并借助socket.io.
我使用AWS Application Load Balancer作为前端,创建了一个目标组,该目标组包含AWS ECS服务。
现在,假设我使用任务定义创建1个服务并将其添加到目标组中,用户开始使用websocket连接到我的AWS ECS服务。
我的问题是,如果我使用新的任务定义更新我的服务,AWS ECS会等待旧的websocket连接优雅地断开连接,还是会强制性地断开连接并使其连接到旧的服务?
2个回答

1

这里涉及到多种因素。

1. 您的最低和最高健康百分比是多少?如果您的最低健康百分比为0,则在更新服务时,只有新任务将运行,并且旧任务将被强制停止。

  1. 您的ALB(应用负载均衡器)中飞行请求的时间决定了旧请求处理过期之前需要多长时间。

1
您的websocket连接将超出ECS的活动范围 - 它无法看到它。因此,ECS在这里无法帮助您,但是...
当您更新服务时,这相当于发送docker stop命令。这意味着会发送一个停止信号
根据ECS文档所述

调用StopTask时,将向运行任务的容器发出与docker stop等效的命令。这将导致SIGTERM和默认的30秒超时,之后发送SIGKILL并强制停止容器。如果容器优雅地处理SIGTERM并在接收到它后30秒内退出,则不会发送SIGKILL。

你应该能够在入口脚本中设置陷阱,以执行某种优雅的交接过程。因此,大致如下:

#!/bin/bash
... other code...
function handleShutdownFoo {
  # do something...
}
trap handleShutdownFoo SIGTERM
... more code ...

想要了解如何将 nodejs 应用程序容器化,请参考来自 Node 团队的指南


我正在使用 https://hub.docker.com/_/node/ 。你能帮我确定陷阱和入口点应该放在哪里吗? - Nitin
如果您不熟悉使用Dockerfile清单文件,我建议您查看以下链接:https://nodejs.org/en/docs/guides/nodejs-docker-webapp/ - getglad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接