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