JavaRush /Курсы /Модуль 4: FastAPI /Введение в Celery: задачи и возможности

Введение в Celery: задачи и возможности

Модуль 4: FastAPI
13 уровень , 0 лекция
Открыта

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

Услышали слово "фоновые задачи" и задумались про магию? Нет, ничего сверхъестественного. Celery как опытный официант берёт на себя те действия, которые не требуют нашего немедленного внимания, например:

  • Обработка большого объёма данных.
  • Отправка уведомлений и писем.
  • Генерация отчётов.
  • Работа с внешними API.

Архитектура Celery

Архитектура Celery строится вокруг трёх основных компонентов:

  1. Продюсеры — это приложения, которые создают задачи для обработки. В нашем случае это FastAPI или Django.
  2. Брокеры сообщений — очередь задач, где задачи ожидают своего выполнения. Обычно для этого используется RabbitMQ или Redis.
  3. Воркеры — это процессы, которые выполняют задачи. Они запускаются в фоновом режиме и выполняют задачи, которые продюсеры добавляют в очередь.

FastAPI/Django (продюсер) -> RabbitMQ/Redis (брокер) -> Celery воркер (выполнение задач)

Основные возможности Celery

Celery — это настоящий швейцарский нож разработчика. Вот несколько ключевых возможностей:

Поддержка различных брокеров сообщений

Celery может работать с различными брокерами сообщений. Самыми популярными являются:

  • RabbitMQ — мощный брокер с поддержкой сложных сценариев маршрутизации задач.
  • Redis — интуитивно понятный и лёгкий брокер, который отлично подходит для быстрого старта.

Брокер гарантирует, что ваша задача не потеряется, даже если сервер внезапно упадёт. Да, это как каска в Python — защищает ваш проект от больших проблем.


Как RabbitMQ понимает, что сообщение обработано

Постоянные очереди хороши тем, что сохраняют сообщения даже после перезапуска сервера. Но чтобы сделать систему действительно надёжной, нужно ещё позаботиться о том, чтобы RabbitMQ знал: "Это сообщение точно обработано, можно его больше не хранить". Для этого используется подтверждение доставки — acknowledgement.

RabbitMQ позволяет вручную подтверждать, что сообщение успешно обработано. Пока вы этого не сделали, оно остаётся в очереди — и если ваш консьюмер вдруг сломается, сообщение не пропадёт, а просто отправится другому обработчику. Это особенно важно, когда дело касается критичных данных, вроде платежей или заказов.

Вот пример простого консьюмера, который обрабатывает сообщения из durable-очереди и явно подтверждает каждое из них:


import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='durable_queue', durable=True)

def callback(ch, method, properties, body):
    print(f"Получено сообщение: {body}")
    
    # Подтверждаем, что всё хорошо и сообщение можно удалить
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(queue='durable_queue', on_message_callback=callback, auto_ack=False)

print("Ожидание сообщений. Нажмите CTRL+C для выхода.")
channel.start_consuming()

Здесь важно, что auto_ack=False — это значит, что сообщение не исчезнет до тех пор, пока мы не скажем "всё, готово" с помощью basic_ack. Такой подход даёт уверенность, что ни одно важное сообщение не потеряется даже при сбоях.


Примеры реальных задач для Celery

Чтобы понять, насколько полезен Celery, давайте взглянем на примеры:

  • Отправка уведомлений и писем: представьте приложение для отправки e-mail. С Celery вы можете отправлять письма асинхронно, не замедляя работу основного потока.
  • Обработка изображений: например, в социальном приложении пользователи загружают изображения, которые нужно сжать или наложить водяной знак. Celery отлично справится с этой задачей.
  • Генерация отчётов: в системах аналитики Celery может генерировать отчёты за определённые периоды.
  • Работа с внешними API: если ваш сервер должен интегрироваться с медленными API, вы можете делать это асинхронно.

Как Celery делает всю работу?

Давайте разберём жизненный цикл задачи в Celery:

  1. В вашем коде вы "упаковываете" задание. Это может быть задача, которая обрабатывает изображения или отправляет письмо.
  2. Celery передаёт задачу в брокер сообщений (например, RabbitMQ).
  3. Брокер сообщений хранит задачу в очереди до тех пор, пока воркер не станет свободным.
  4. Воркер берёт задачу из очереди и выполняет её.
  5. После завершения задачи воркер может сохранить результат (например, в базе данных).

Вот так просто Celery берёт сложную задачу и разбивает её на понятные этапы, чтобы ни один компонент системы не перегружался.


Давайте напишем свой первый код с Celery

Для начала нам нужно установить Celery. Запускаем следующую команду:


pip install celery

Если вы собираетесь использовать Redis в качестве брокера сообщений, установите дополнительные зависимости:


pip install redis

Минимальный пример

Создадим файл tasks.py:


# tasks.py

from celery import Celery

# Создаём приложение Celery
app = Celery('example', broker='redis://localhost:6379/0')

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

После этого запустим воркер:


celery -A tasks worker --loglevel=info

Теперь в Python консоли мы можем вызвать задачу асинхронно:


>>> from tasks import add
>>> result = add.delay(4, 6)
>>> print(result.get())  # Ожидаем результат
10

Этот пример демонстрирует, как легко создавать и запускать фоновые задачи с помощью Celery.


Преимущества и недостатки использования Celery

Преимущества:

  • Простое использование и гибкость.
  • Поддержка большого количества брокеров.
  • Огромное сообщество и множество документации.
  • Асинхронность повышает производительность системы.

Недостатки:

  • Требуется отдельная инфраструктура для брокера (например, RabbitMQ или Redis).
  • Могут возникать сложности с мониторингом и отладкой (но для этого есть такие инструменты, как Celery Flower).

На следующей лекции мы научимся разворачивать Celery в реальных проектах на Django и FastAPI. Мы посмотрим, как интегрировать Celery в существующие проекты и проверим его на практике. Готовьтесь к кодингу!

1
Задача
Модуль 4: FastAPI, 13 уровень, 0 лекция
Недоступна
Установка и настройка Celery
Установка и настройка Celery
1
Задача
Модуль 4: FastAPI, 13 уровень, 0 лекция
Недоступна
Установка и настройка Celery
Установка и настройка Celery
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ