Фоновые воркеры
Долгоживущие процессы без HTTP-порта: консьюмеры очередей, чат-боты, ETL-конвейеры и всё, что должно работать постоянно.
Когда нужен воркер#
- Чтение очереди (RabbitMQ, Redis, Kafka) и обработка задач.
- Боты для Telegram, Discord или Slack на long polling.
- Потоковые и ETL-процессы, которые непрерывно читают, преобразуют и пишут.
- Планировщики, реализованные внутри приложения, а не отдельными cron-записями.
Воркер или cron-задача?
Воркер работает постоянно. Если задача запускается по расписанию и завершается, используйте задачу по расписанию — платить будете только за время выполнения.
Создание воркера#
- 1Создайте сервисВ console.muerte.cloud нажмите Создать сервис → Фоновый воркер.
- 2Подключите репозиторийВыберите репозиторий и ветку либо Docker-образ. Автодеплой при push работает так же, как у веб-сервисов.
- 3Укажите команду запускаНапример
node worker.js,python worker.pyилиcelery -A app worker -l info. - 4Добавьте переменные и ресурсыДоступы к очереди и базе — в переменных окружения. Воркеры чаще ограничены памятью, а не CPU.
Ни порта, ни публичного адреса#
У воркера нет публичного адреса и нет health-check по HTTP-порту. Он считается живым, пока жив процесс. Если процесс завершится, платформа перезапустит его: выход трактуется как сбой, а не как нормальное окончание работы.
worker.js
js
import { consume } from "./queue.js";
async function main() {
for await (const job of consume("emails")) {
await handle(job);
}
}
main().catch((err) => {
console.error(err);
process.exit(1); // платформа перезапустит воркер
});Корректное завершение
При передеплое контейнер получает SIGTERM и окно на завершение. Перестаньте брать новые задачи, докончите текущую и выйдите — иначе деплой прервёт работу на середине.
worker.js
js
let stopping = false;
process.on("SIGTERM", () => { stopping = true; });
while (!stopping) {
const job = await queue.take();
if (job) await handle(job);
}
await queue.close();Логи, состояние и масштабирование#
- Всё, что процесс пишет в stdout и stderr, попадает в логи сервиса — это основной способ наблюдать за воркером.
- Локальные файлы исчезают при передеплое, если не подключить постоянный диск.
- Несколько воркеров на одной очереди имеют смысл только если очередь гарантирует выдачу задачи одному консьюмеру — проверьте идемпотентность перед масштабированием.
- История деплоев и откаты работают для воркеров так же, как для веб-сервисов.
Частые ошибки#
Процесс сразу завершается
Воркер должен блокироваться. Скрипт, который заканчивается, — это cron.
Нет обработки SIGTERM
Тогда деплой обрывает задачи на середине.
Секреты в репозитории
Доступы к очереди и базе — в переменные.
Тихие сбои
Логируйте ошибки и включите уведомления о деплоях.
Неограниченная память
Читайте пачками: упор в лимит RAM перезапустит воркер.
Расчёт на локальный диск
Если храните состояние в файлах — подключите диск.