ДокументацияВычисленияФоновые воркеры

Фоновые воркеры

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

Когда нужен воркер#

  • Чтение очереди (RabbitMQ, Redis, Kafka) и обработка задач.
  • Боты для Telegram, Discord или Slack на long polling.
  • Потоковые и ETL-процессы, которые непрерывно читают, преобразуют и пишут.
  • Планировщики, реализованные внутри приложения, а не отдельными cron-записями.
Воркер или cron-задача?
Воркер работает постоянно. Если задача запускается по расписанию и завершается, используйте задачу по расписанию — платить будете только за время выполнения.

Создание воркера#

  1. 1
    Создайте сервис
    В console.muerte.cloud нажмите Создать сервисФоновый воркер.
  2. 2
    Подключите репозиторий
    Выберите репозиторий и ветку либо Docker-образ. Автодеплой при push работает так же, как у веб-сервисов.
  3. 3
    Укажите команду запуска
    Например node worker.js, python worker.py или celery -A app worker -l info.
  4. 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 перезапустит воркер.
Расчёт на локальный диск
Если храните состояние в файлах — подключите диск.