1

我们正在使用 aws ecs 任务来运行我们的 docker 容器。我们的应用程序正在连接到 TIBCO 队列并使用 AlpakkaJMSListeners 从队列中读取消息。

我们希望在 ec2 实例级别为这些容器启用自动缩放。我们为我们的一些具有 http 端点的服务定义了具有目标组的应用程序 LB。

我知道如果我们使用启用了 http 健康检查并在实例上自动缩放的目标组,那么 ecs 任务将在停止容器之前耗尽请求。

问题是当我们的容器通过自动缩放连接到 JMS 队列时,如何实现相同的行为(即在容器停止之前排出所有消息)?

4

1 回答 1

0

我们为此找到了一种解决方法,默认情况下,ECS 任务在触发 TERM 信号时会等待 30 秒以让当前线程完成其任务。

ref - https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_StopTask.html
通过在侦听器中添加 SIGTERM 处理程序,我们可以停止使用 msgs 并处理飞行消息。

在 jms 监听器中添加终端信号处理,如下所示

Signal.handle(new Signal("TERM"), signal -> {
        log.info("Received termination signal" +signal.getName());
        if ("TERM".equals(signal.getName())) {
            try {
                stopStream();
                log.info("Stopped stream");
            } catch (Exception e) {
                log.error("Exception while handling signal: "+e);
            }
        }
    });

注意:为了接收信号,请确保您的应用程序作为单独的 java 进程运行;

于 2021-04-12T07:48:42.180 回答