У нас есть приложение, которое запускается на экземплярах ec2, которые мы используем в качестве хоста докера в кластере ecs. На каждом ec2 выполняется несколько задач. Каждая задача получает одно сообщение из SQS и обрабатывает некоторое событие (которое преобразует данные из одного формата в другой и загружает их в файловую систему), что может занять от нескольких секунд до 12-15 часов в зависимости от размера содержащихся в них данных. После завершения обработки события задача останавливается, и для нового сообщения (события) создается новая задача. Всякий раз, когда в SQS имеется огромное количество сообщений, мы увеличиваем количество экземпляров для обработки сообщений (чтобы избежать времени ожидания). Когда (количество сообщений) <(количество запущенных задач) за определенную продолжительность, нам нужно уменьшить масштаб, т.е. нам нужно завершить экземпляры ec2. </p>
Для сокращения ec2 нам нужно убедиться, что нетзадача выполняется, т. е. контейнер не обрабатывает никаких событий. Нет никакого способа выяснить, какие ec2 свободны (не обрабатывая никаких событий), поэтому мы пометили контейнер в состояние DRAINING, а затем TERMINATING ec2. Но в то время как мы помечаем любой контейнер в опустошенное состояние, выполняемая на нем задача останавливается (следовательно, обработка событий прерывается и данные теряются). Есть ли какая-то причина, по которой мы можем завершить процесс до того, как задачи будут остановлены, или кто-то может предложить лучший подход.