Все материалы

Фоновые задачи

Мониторинг воркера: процесс жив, но работа не выполняется

Выбираем точку heartbeat для воркера, учитываем пустую очередь и отличаем живой процесс от успешной обработки.

Команда Uptimely

Воркер может оставаться запущенным, пока сообщения копятся в очереди: потеряно соединение, завис обработчик или ошибка повторяется без завершения работы. Проверка PID или HTTP-ответа сервера не обязательно заметит такой отказ. Heartbeat-мониторинг добавляет сигнал из выбранной точки рабочего цикла.

Сначала определите значение сигнала

Есть два разных вопроса: проходит ли процесс очередной цикл и завершает ли он полезную работу. Один сигнал не всегда отвечает на оба. Выберите событие до добавления HTTP-запроса.

СигналЧто он подтверждаетЧего не доказывает
После успешного обращения к очередиРабочий цикл дошёл до контрольной точкиЧто сообщение действительно обработано
После обработки и фиксации результатаКонкретная работа прошла выбранные проверкиЧто следующий цикл не зависнет
Из независимого таймераТаймер продолжает исполнятьсяЧто основной обработчик работоспособен

Для регулярного цикла подходит интервальный Heartbeat. Срок следующего сигнала считается от последнего принятого запроса. Не отправляйте сигнал из таймера, который продолжит работать при зависании основной операции: это создаёт ложное подтверждение здоровья.

Учтите пустую очередь

Отсутствие сообщений часто нормально. Если сигнал означает успешный обход очереди, отправляйте его после того, как воркер убедился, что очередь доступна: как после обработанной работы, так и после корректного пустого ответа.

Если сигнал означает выполнение обязательного задания, пустой ответ не заменяет результат. Для такой задачи создайте отдельный монитор с обоснованным ожидаемым сроком. Не задавайте регулярный срок выполнения для работы, которая законно может не появляться несколько дней.

Поместите heartbeat после контрольной операции

Для конечного пакетного запуска можно использовать Bash-обёртку. Замените команду своей и передайте URL через окружение.

#!/usr/bin/env bash set -euo pipefail : "${HEARTBEAT_URL:?Задайте URL из настроек монитора}" /opt/worker/process-batch.sh curl --fail --silent --show-error \ --connect-timeout 5 --max-time 15 "$HEARTBEAT_URL"

Для бесконечно работающего воркера вызов должен находиться внутри его цикла после выбранной контрольной точки, а не после команды запуска процесса: она может не завершаться месяцами. Используйте HTTP-клиент с timeout. Не пингайте на каждое сообщение при большом потоке — выберите разумную частоту подтверждения успешных циклов и согласуйте её с интервалом монитора.

Ошибка heartbeat не должна повторно подтверждать или обрабатывать сообщение. Логируйте отдельно результат работы и факт неудачной отправки, не раскрывая секретный URL. Поведение доставки сигнала не должно менять гарантию обработки сообщений вашего приложения.

Согласуйте ожидание с реальным циклом

Если цикл занимает минуту, а внешняя зависимость иногда отвечает несколько минут, слишком короткое ожидание создаст пропуски при нормальной работе. Сначала измерьте типичное и предельное время цикла, затем задайте интервал и запас. В интервальном режиме учитывайте время от сигнала до сигнала, включая ожидание новой работы и обработку.

Grace period даёт допуск, но не объясняет задержку. Смотрите примеры выбора окна и сопоставляйте пропуски с журналами, числом сообщений и возрастом самого старого сообщения в очереди. Heartbeat сам по себе не измеряет эти показатели очереди.

Проверьте наблюдаемость

На отдельном тестовом процессе пройдите четыре состояния: успешный цикл, допустимое ожидание, отсутствие сигнала, возобновление работы. Настройте канал уведомлений и проверьте не только историю, но и полученное оповещение. Для проверки зависания используйте изолированный локальный стенд, не останавливая рабочую инфраструктуру.

Пошаговая инструкция подключения содержит Bash и Python. Для календарных заданий выберите мониторинг cron с отдельным расписанием.