【问题标题】:AWS ECS websocket connection draining while updating ECS service更新 ECS 服务时 AWS ECS websocket 连接耗尽
【发布时间】:2021-10-16 01:24:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: amazon-web-services docker websocket aws-ecs


    【解决方案1】:

    您的 websocket 连接将超出 ECS 的活动范围 - 它无法看到它。所以 ECS 在这里帮不了你,但是......

    更新服务时,相当于发送docker stop 命令。这意味着发送了一个stop signal

    According to the ECS docs:

    在任务上调用 StopTask 时,相当于 docker stop 发给任务中运行的容器。这导致一个 SIGTERM 和默认的 30 秒超时,之后发送 SIGKILL 并且容器被强制停止。如果容器处理 SIGTERM 优雅并在收到后 30 秒内退出,否 SIGKILL 已发送。

    您应该能够在您的entrypoint script 中使用to set a trap,它可以执行某种优雅的切换过程。

    所以大致如下:

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

    有关容器化 nodejs 应用程序的更多信息,review this guide from the Node team

    【讨论】:

    【解决方案2】:

    这里有多种因素。

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

    1. 您在 alb 中的飞行请求时间是什么时间,这决定了您的旧请求在到期前将被处理多长时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2018-02-11
      相关资源
      最近更新 更多