Celery: Дозволяє асинхронну обробку завдань, розділяючи важкі завдання від основного циклу запит-відповідь, що підвищує чутливість додатку.
У сучасну цифрову еру веб-додатки повинні мати здатність обробляти піки трафіку та складну обробку даних.
Масштабованість є основним фактором для забезпечення оптимальної продуктивності додатків.
Ця стаття надасть вам керівництво з побудови масштабованого додатку, використовуючи Flask (мікрофреймворк для Python), Celery (черга завдань), RabbitMQ (посредник повідомлень) та Docker Compose (для оркестрації контейнерів).
https://www.youtube.com/@halovina
Чому варто вибрати таку комбінацію?
- Flask: Легкий, гнучкий та простий у навчанні, підходить для створення простих та складних API і веб-додатків.
- Celery: Дозволяє асинхронну обробку завдань, розділяючи важкі завдання від основного циклу запит-відповідь, що підвищує чутливість додатку.
- RabbitMQ: Діє як надійний та ефективний посредник повідомлень між Flask та Celery додатками.
- Docker Compose: Спрощує управління та розгортання додатків і їх залежностей у ізольованих контейнерах.
Архітектура додатку
Ось огляд архітектури додатку, який ми будемо будувати:
[Клієнт] --> [Flask додаток] --> [RabbitMQ] --> [Celery робітники]
- Клієнт надсилає запит до Flask додатку.
- Flask надсилає завдання до RabbitMQ.
- Celery робітник отримує завдання з RabbitMQ і обробляє його асинхронно.
Кроки впровадження
Ось короткий опис кроків впровадження:
- Підготовка середовища: Переконайтеся, що Docker і Docker Compose встановлені.
- Створіть Flask додаток: Створіть простий Flask додаток, який приймає запити та надсилає завдання до Celery.
- Налаштуйте Celery та RabbitMQ: Налаштуйте Celery для підключення до RabbitMQ як брокера.
- Створіть Docker Compose файл: Визначте сервіси для Flask, Celery, RabbitMQ та Redis (опційно, для результатів Celery) у docker-compose.yml.
- Запустіть додаток: Використовуйте команду docker-compose up -d для запуску всього додатку.
Ось простий приклад docker-compose.yml:
version: "3.9"
services:
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
web:
build: ./web
ports:
- "5000:5000"
depends_on:
- rabbitmq
celery:
build: ./worker
command: celery -A tasks worker --loglevel=info
depends_on:
- rabbitmq
- web
(Переконайтеся, що структура директорій та Dockerfile для web і worker правильні)
Приклад коду (спрощений)
tasks.py (Для Celery):
from celery import Celery
app = Celery('tasks', broker='amqp://guest@rabbitmq//')
@app.task
def long_task(x, y):
# Симуляція часозатратного завдання
import time
time.sleep(5)
return x + y
app.py (Для Flask):
from flask import Flask
from tasks import long_task
app = Flask(__name__)
@app.route('/add//')
def add(x, y):
task = long_task.delay(x, y)
return f"Завдання надіслано. Ідентифікатор завдання: {task.id}"
Переваги використання цієї архітектури
- Горизонтальна масштабованість: Легко додавати екземпляри робітників Celery для обробки більшої кількості завдань паралельно.
- Підвищена чутливість: Важкі завдання обробляються у фоновому режимі, тому додаток залишається чутливим до запитів користувачів.
- Ефективне управління завданнями: Celery надає механізми для управління чергами завдань, планування та моніторингу.
- Ізоляція середовища: Docker забезпечує консистентність середовища для розгортання та спрощує процес розгортання.
Висновок
Поєднавши Flask, Celery, RabbitMQ та Docker Compose, ви зможете створювати масштабовані, чутливі та зручні для управління веб-додатки.
Ця архітектура є ідеальною для додатків, які потребують асинхронної обробки та обробки високих навантажень.
Перекладено з: Build Scalable Applications with Flask, Celery, RabbitMQ, and Docker Compose