Как удалить сообщение из док-контейнера aws ecs, который работает за группой автомасштабирования и подключен к очереди jms

мы используем задачу aws ecs для запуска наших контейнеров докеров. наши приложения подключаются к очередям TIBCO и используют AlpakkaJMSListeners для чтения сообщений из очередей.

Мы хотим включить автомасштабирование для этих контейнеров на уровне экземпляра ec2. У нас есть приложение LB с целевой группой, определенной для некоторых наших сервисов, которые имеют конечные точки http.

Я знаю, что если мы используем целевую группу с включенной проверкой работоспособности http и автомасштабированием экземпляров, то задача ecs будет сбрасывать запросы перед остановкой контейнера.

Вопрос заключается в том, как добиться такого же поведения (т. е. удаления всех сообщений до остановки контейнера), когда наши контейнеры подключены к очередям JMS с автомасштабированием?


person Ali    schedule 02.08.2020    source источник
comment
Вам действительно нужно сливать сообщения, можете ли вы просто остановить контейнер, и все необработанные сообщения будут обрабатываться другим контейнером?   -  person terma    schedule 06.08.2020
comment
Вы можете использовать stopTimeout, чтобы предоставить задачу за некоторое время до того, как она будет фактически остановлена, и заблокировать завершение экземпляра docs.aws.amazon.com/AmazonECS/latest/developerguide/   -  person terma    schedule 06.08.2020


Ответы (1)


мы нашли обходной путь для этого: по умолчанию задача ECS, когда запускает сигнал TERM, ждет 30 секунд, чтобы позволить текущему потоку завершить свою задачу.

ссылка — https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_StopTask.html,
Добавив обработчик SIGTERM в прослушиватель, мы можем остановить потребление сообщений и обрабатывать сообщения в пути.

добавить обработку сигнала терминала в прослушивателе 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;

person Ali    schedule 12.04.2021