Каково назначение и различие 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) и вам не важен результат их выполнения.

Ответ 18+ 🔞

Вот, смотри, объясняю на пальцах, чтобы даже самый упоротый бэкендер, который только про SELECT * знает, понял. В Celery есть две главные сущности, которые постоянно путают, как хуй с пальцем: broker и backend.

Broker (Брокер, он же посыльный, он же почтальон Печкин)

Это, блядь, очередь задач. Обязательная хуйня, без неё нихуя не работает. Твоё приложение кричит: "Эй, выполни эту задачу!" — и швыряет её в брокера. Брокер, как тот самый почтальон, тащит эту задачу до первого свободного воркера и суёт ему в руки. Всё, его работа сделана.

  • Суть: Транспорт, дрочильня для сообщений. Гарантирует, что задача не потеряется по дороге.
  • На что похоже: Та самая почта, куда ты кидаешь письмо и надеешься, что дойдёт.
  • Что используют: RabbitMQ (это, блядь, золотой стандарт, для прода — самое то), Redis (попроще), Amazon SQS (для облачных любителей).

Result Backend (Бэкенд, он же архив, он же "а где мой результат, сука?")

А вот это уже хранилище результатов. Оно необязательное, ёпта! Нужно только если тебе жизненно важно знать, что там задача сделала — успех, провал или просто сгорела в аду.

  • Суть: База или хранилище, куда складывают статусы и что задача там навозвращала.
  • На что похоже: Система отслеживания посылок. Отправил — и потом можешь задротски обновлять страницу, ждать, когда статус сменится с "В пути" на "Доставлено, иди забирай, лох".
  • Что используют: Тот же Redis (удобно, всё в одном месте), Memcached (быстро, но летуче), настоящие базы типа PostgreSQL через SQLAlchemy (для параноиков, которые всё хранят вечно).

Пример кода, чтобы было совсем понятно

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 просто труп. Задачи будут тыкаться в закрытую дверь и нихуя не происходить.
  • Без бэкенда — жить можно! Если похуй на результат и статус (типа "отправил и забыл, как в прошлое воскресенье"), то можешь его не указывать. Задачи всё равно выполнятся, просто ты никогда не узнаешь, что они там наотвечали.