3

我正在使用 AWS ECS 在 socket.io 的帮助下运行用 nodejs 编写的聊天应用程序。

我使用 AWS Application Load Balancer 作为前端并创建了一个目标组,目标组包含 AWS ECS 服务。

现在,假设我用我的容器(使用任务定义)创建了 1 个服务并添加到目标组中,并且用户开始使用 websocket 连接到我的 AWS ECS 服务。

我的问题是,如果我用新的任务定义更新我的服务,AWS ECS 会等待旧的 websocket 连接正常断开还是强制断开旧的 websocket 连接与旧服务?

4

2 回答 2

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 团队的本指南

于 2018-07-23T13:33:02.553 回答
1

这里有多种因素。

1 您的最小和最大健康百分比是多少,如果您的最小健康百分比为 0,那么在更新服务时,只有您的新任务将运行,而旧任务将被强制停止。

  1. 您的飞行请求时间在 alb 中的时间是多少,这决定了您的旧请求在过期之前将被处理多长时间。
于 2021-10-15T17:18:34.490 回答