Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: CPU-bound, background job, worker, message queue, async processing

Есть CPU-bound задача, которая выполняется несколько минут — как вынести её так, чтобы не блокировать основной сервис?

Вопрос проверяет понимание стратегий выноса длительных CPU-bound задач из основного потока приложения для сохранения отзывчивости сервиса.

Короткий ответ

CPU-bound задачи блокируют event loop в Node.js или основной поток в других языках. Чтобы не блокировать сервис, задачу выносят в отдельный воркер или микросервис. Обычно используют очередь сообщений (RabbitMQ, Kafka) или пул воркеров (Worker Threads в Node.js, Celery в Python). Основной сервис отправляет задачу в очередь и сразу отвечает клиенту, а воркер выполняет её асинхронно.

Длинный ответ

Проблема CPU-bound задач

CPU-bound задача интенсивно использует процессор и выполняется несколько минут. Если запустить её в основном потоке веб-сервера, сервер перестанет отвечать на другие запросы до завершения задачи. Это неприемлемо для production-систем.

Архитектурные решения

Самый распространённый подход — вынести задачу в фоновый процесс (воркер) и общаться с ним через очередь сообщений. Основной сервис (продюсер) отправляет задачу в очередь и сразу возвращает клиенту HTTP 202 Accepted. Воркер (консьюмер) забирает задачу, выполняет её и сохраняет результат в базу данных или отправляет уведомление.

Пример на Node.js с использованием Worker Threads:

// main.js (основной сервер)
const { Worker } = require('worker_threads');

app.post('/heavy-task', (req, res) => {
  const worker = new Worker('./worker.js');
  worker.postMessage(req.body.data);
  worker.on('message', (result) => {
    // сохраняем результат в БД
  });
  res.status(202).send({ status: 'accepted' });
});

// worker.js (воркер)
const { parentPort } = require('worker_threads');

parentPort.on('message', (data) => {
  const result = performHeavyCpuTask(data); // долгая CPU-bound работа
  parentPort.postMessage(result);
});

Пример на Python с Celery и RabbitMQ:

# tasks.py
from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def heavy_cpu_task(data):
    # CPU-bound логика
    return result

# main.py (Flask)
from tasks import heavy_cpu_task

@app.route('/heavy-task', methods=['POST'])
def start_task():
    task = heavy_cpu_task.delay(request.json)
    return {'task_id': task.id}, 202

Альтернативные подходы

  • Отдельный микросервис — выделить CPU-bound логику в отдельный сервис, общаться по HTTP/gRPC.
  • Serverless функции — для задач до 15 минут (AWS Lambda, Google Cloud Functions).
  • Пул процессов — в Node.js можно использовать cluster или child_process.fork().

Вывод

Вынос CPU-bound задач в фоновые воркеры через очередь сообщений — стандартный паттерн для масштабируемых систем. Он сохраняет отзывчивость основного сервиса, позволяет легко масштабировать обработку и обеспечивает надёжность (задачи не теряются при падении воркера).

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Node.js

    Node.js

  • RabbitMQ

    RabbitMQ

Ключевые слова

#CPU-bound

#background job

#worker

#message queue

#async processing

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.