Celery worker | Учебник по настройке с помощью Flask и Redis

Это руководство было первоначально опубликовано в блоге SigNoz и написано Эззом.

Celery worker — это простая, гибкая и надежная распределенная система для обработки огромного количества сообщений, предоставляющая операторам инструменты, необходимые для обслуживания такой системы. В этом руководстве мы узнаем, как реализовать Celery с помощью Flask и Redis.

Прежде чем мы погрузимся в учебник, давайте сделаем краткий обзор Celery workers.

Что такое работник Celery?

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

Давайте попробуем понять роль работника Celery на примере. Представьте, что вы приехали на станцию техобслуживания, чтобы обслужить свой автомобиль. Вы размещаете на стойке регистрации запрос на обслуживание вашего автомобиля.

  1. Сообщение
    Вы обращаетесь на стойку регистрации с просьбой обслужить ваш автомобиль. Этот запрос является сообщением.

  2. Задание
    Обслуживание вашего автомобиля — это задача, которую необходимо выполнить.

  3. Очередь задач
    Как и вы, на станции будут и другие клиенты. Все автомобили клиентов, ожидающие обслуживания, являются частью очереди задач.

  4. Рабочий
    Механики на станции — это рабочие, которые выполняют задания.

Celery использует брокеров для распределения задач между несколькими работниками и управления очередью задач. В приведенном выше примере сотрудник, который принимает заявку на обслуживание вашего автомобиля от стойки регистрации до мастерской, является брокером. Роль брокера заключается в доставке сообщений между клиентами и работниками.

Примерами брокеров сообщений являются Redis, RabbitMQ, Apache Kafka и Amazon SQS.

В этом учебнике мы будем использовать Redis в качестве брокера, Celery в качестве рабочего и Flask в качестве веб-сервера. Мы познакомим вас с концепциями Celery на двух примерах, переходя от более простых к более сложным задачам.

Давайте приступим и установим Celery, Flask и Redis.

Предварительные условия

Чтобы следовать этому руководству, вам необходимо иметь базовые знания о Flask. Вам не нужно иметь никаких знаний о Redis; однако, было бы неплохо быть знакомым с ним.

Установка Flask, Celery и Redis

Сначала начните новый проект с новой виртуальной средой с Python 3 и обновленной версией pip:

$ python3 -m venv venv
$ . venv/bin/activate
$ pip install --upgrade pip
Войдите в полноэкранный режим Выйти из полноэкранного режима

и установите Flask, Celery и Redis: (Следующая команда включает версии, которые мы используем в этом учебнике)

$ pip install celery==4.4.1 Flask==1.1.1 redis==3.4.1
Войти в полноэкранный режим Выйти из полноэкранного режима

Запуск Redis локально

Запустите сервер Redis на локальной машине (предположительно Linux или macOS) с помощью следующих команд:

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ rm redis-stable.tar.gz
$ cd redis-stable
$ make
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь компиляция завершена. В каталоге src внутри redis-stable/ доступны некоторые двоичные файлы, такие как redis-server (это сервер Redis, который вам понадобится для запуска) и redis-cli (это клиент командной строки, который может понадобиться для работы с Redis).
Чтобы запустить сервер глобально (из любого места на вашей машине) вместо того, чтобы каждый раз перемещаться в каталог src, вы можете использовать следующую команду:

$ make install
Войти в полноэкранный режим Выйти из полноэкранного режима

Двоичные файлы redis-server теперь доступны в вашем каталоге /usr/local/bin. Вы можете запустить сервер с помощью следующей команды:

$ redis-server
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь сервер работает на порту 6379 (порт по умолчанию). Оставьте его запущенным на отдельном терминале.
Нам понадобятся еще две новые вкладки терминала, чтобы позже запустить веб-сервер и Celery worker. Но прежде чем запускать веб-сервер, давайте интегрируем Flask с Celery и подготовим наш веб-сервер к работе.

Интеграция Flask и Celery

Интегрировать Flask с Celery очень просто. Давайте начнем с простого и напишем следующий код импорта и инстанцирования:

from flask import Flask
from celery import Celery

app = Flask(__name__)
app.config["CELERY_BROKER_URL"] = "redis://localhost:6379"

celery = Celery(app.name, broker=app.config["CELERY_BROKER_URL"])
celery.conf.update(app.config)
Вход в полноэкранный режим Выход из полноэкранного режима

app — это объект приложения Flask, который вы будете использовать для запуска веб-сервера. celery — это объект Celery, который вы будете использовать для запуска Celery worker.

Обратите внимание, что конфигурация CELERY_BROKER_URL здесь установлена на сервер Redis, который вы запускаете локально на своей машине. Вы можете изменить это значение на любой другой брокер сообщений, который вы хотите использовать.

Объект celery принимает имя приложения в качестве аргумента и устанавливает аргумент broker на тот, который вы указали в конфигурации.

Чтобы добавить конфигурацию Flask в конфигурацию Celery, вы обновляете ее с помощью метода conf.update.

Теперь пришло время запустить Celery worker.

Запуск Celery worker

В новой вкладке терминала выполните следующую команду:

(venv) $ celery -A app.celery worker --loglevel=info
Войти в полноэкранный режим Выйти из полноэкранного режима

где celery — это версия Celery, которую вы используете в этом руководстве (4.4.1), с опцией -A для указания экземпляра celery для использования (в нашем случае это celery в файле app. py, поэтому это app.celery), и worker — подкоманда для запуска рабочего, и --loglevel=info для установки уровня журнала verbosity на INFO.

Вы увидите нечто похожее на следующее:

Давайте погрузимся в логику внутри вашего приложения Flask перед запуском веб-сервера.

Запуск веб-сервера Flask

Сначала добавим декоратор задач celery с методом task() и обернем функцию, которую мы хотим запустить как задачу Celery, в этот декоратор:

@celery.task()
def add(x, y):
        return x + y
Войти в полноэкранный режим Выйти из полноэкранного режима

Таким образом, эта простая функция add теперь является задачей Celery. Затем добавьте маршрут к вашему веб-серверу для обработки GET-запроса к корневому URL и добавьте пару чисел в качестве параметров функции add:

@app.route('/')
def add_task():
for i in range(10000):
    add.delay(i, i)
return jsonify({'status': 'ok'})
Вход в полноэкранный режим Выйти из полноэкранного режима

Примечание: Не забудьте импортировать функцию jsonify из модуля flask, чтобы иметь возможность возвращать данные в формате JSON.

Теперь запустите веб-сервер с помощью следующей команды:

$flask run
Войти в полноэкранный режим Выйти из полноэкранного режима

Когда вы проверите URL localhost:5000 в своем браузере, вы должны увидеть следующий ответ:

{
    "status": "ok"
}
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что этот ответ не отображается мгновенно в вашем браузере. Это потому, что сервер Redis слушает клиента и заносит задачу в очередь задач этой функции add_task. Затем рабочий Celery должен дождаться каждую задачу, прежде чем начать ее выполнение.

Это демонстрирует, как Celery использует Redis для распределения задач между несколькими рабочими и для управления очередью задач.

Вы можете найти весь пример кода для этого руководства на этом репозитории GitHub.

Заключение

В этом руководстве вы узнали, что такое Celery worker и как использовать его с брокером сообщений, таким как Redis, в приложении Flask.

Celery worker используется для разгрузки процессов, требующих больших объемов данных, в фоновом режиме, что делает приложения более эффективными. Celery обладает высокой доступностью, и один Celery worker может обрабатывать миллионы задач в минуту.

Поскольку рабочие Celery выполняют критически важные задачи в масштабе, важно также контролировать их производительность. Celery можно использовать для проверки и управления рабочими узлами с помощью некоторых команд терминала. Если вам нужна целостная картина работы кластеров Celery, вы можете использовать SigNoz — платформу наблюдаемости с открытым исходным кодом.

Она может отслеживать все компоненты вашего приложения — от метрик приложения и производительности базы данных до мониторинга инфраструктуры. Например, ее можно использовать для мониторинга приложений Python на предмет проблем с производительностью и ошибок.

SigNoz полностью с открытым исходным кодом и может быть размещен в вашей инфраструктуре. Вы можете попробовать SigNoz, посетив его репозиторий на GitHub 👇.

Если вы хотите узнать больше о мониторинге приложений Python с помощью SigNoz, перейдите по ссылкам ниже:

  • Мониторинг приложений Python
  • Мониторинг производительности приложений Django

Оцените статью
Procodings.ru
Добавить комментарий