Каково назначение и различие broker и backend в Celery?

Ответ

В Celery broker и backend выполняют две совершенно разные, но взаимодополняющие роли: брокер отвечает за транспортировку задач, а бэкенд — за хранение их результатов.

Broker (Брокер сообщений)

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

  • Роль: Посредник, транспорт. Гарантирует, что задача будет передана на выполнение.
  • Аналогия: Почтовое отделение, принимающее письма (задачи) для отправки.
  • Примеры: RabbitMQ (рекомендуется для production), Redis, Amazon SQS.

Result Backend (Хранилище результатов)

Это база данных или key-value хранилище, где Celery сохраняет состояние (PENDING, SUCCESS, FAILURE) и результат выполнения задачи. Этот компонент необязателен — он нужен только если вам необходимо отслеживать статус задач или получать их результат.

  • Роль: Хранилище, архив.
  • Аналогия: Система отслеживания посылок, где можно проверить статус и узнать о доставке.
  • Примеры: Redis, Memcached, SQLAlchemy (PostgreSQL, MySQL), RPC.

Пример конфигурации

from celery import Celery

app = Celery(
    'tasks',
    # Broker: куда отправлять задачи
    broker='redis://localhost:6379/0',
    # Backend: откуда забирать результаты
    backend='redis://localhost:6379/0'
)

@app.task
def add(x, y):
    return x + y

Ключевой вывод:

  • Без брокера Celery работать не может.
  • Без бэкенда можно обойтись, если вы используете задачи по принципу "отправил и забыл" (fire-and-forget) и вам не важен результат их выполнения.