Я давно пользуюсь AWS Fargate и очень люблю этот сервис.
На этой неделе я создал панель мониторинга , которая детализирует последние времена выполнения моих контейнеров и отметку времени для каждой из моих таблиц (значение даты MAX обновлено). У меня есть темы SNS для отправки мне электронной почты всякий раз, когда контейнер выходит с кодом 1.
Однако сегодня я столкнулся с сложной проблемой, которая ускользнула от этих мер безопасности из-за того, что я подозреваю, что это была тупиковая ситуация, связанная с экземпляром Postgres RDS.
У меня есть несколько задач, выполняемых в разные моменты дня в планировщике (обычно каждые X или Y часов). Большинство из этих задач будут выполнять некоторые вычисления бизнес-логики и вставлять / обновлять экземпляр RDS.
Одна из моих задач (при проверке журналов Cloudwatch позже) застряла при обновлении таблицы, и в основном просто зависла там в ожидании. Я предполагаю, что пользователь (возможно, я) - вручную делал небольшой оператор обновления для той же таблицы, вызывая какую-то блокировку, которая.
Поскольку мои задачи устанавливаются периодически, этой же задаче был предоставлен другой контейнер несколько часов спустя, предпринята попытка обновить ту же таблицу, а также завис.
Я заметил эту проблему только потому, что моя панель мониторинга показала, что дата обновления водяного знака была еще несколько дней назад, хотя я не получал никаких предупреждений или уведомлений об ошибках во время выполнения моего контейнера. К этому времени у меня было запущено 3 контейнера, каждый из которых привязан к одному и тому же обновлению к одной и той же таблице.
После того, как я вошел в консоль ECS, я увидел, что в моем кластере запущены 3 экземпляра задачи - все одна и та же задача, все застряли при одной и той же вставке.
Итак, мои вопросы:
- есть ли способ указать максимум времени выполнения для этих задач (т. Е. Если задача не завершится в течение 2 часов, завершиться с кодом выхода 1)
- Я пытаюсь выяснить лучший способ предотвратить этот тип "тихого сбоя" в будущем ? Я добавил в логику приложения выполнение проверки запросов на наличие заблокированных идентификаторов процессов с запросами в моем экземпляре RDS, и если он замечает какие-либо заблокированные PIDS, он пропускает обновление. Но есть ли более изящные способы обнаружения и решения этой проблемы?