Фоновые задачи
Мониторинг воркера: процесс жив, но работа не выполняется
Выбираем точку heartbeat для воркера, учитываем пустую очередь и отличаем живой процесс от успешной обработки.
Воркер может оставаться запущенным, пока сообщения копятся в очереди: потеряно соединение, завис обработчик или ошибка повторяется без завершения работы. Проверка 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 с отдельным расписанием.