JavaRush /Курси /Модуль 4: FastAPI /Як налаштувати гібридну архітектуру для великих проєктів

Як налаштувати гібридну архітектуру для великих проєктів

Модуль 4: FastAPI
Рівень 10 , Лекція 6
Відкрита

Перед тим як почати проєктування гібридної архітектури, важливо відповісти на кілька ключових питань:

  • Які дані будуть зберігатися? Розділи їх на структуровані (наприклад, критично важливі транзакції, які потребують суворої ACID-логіки) і неструктуровані (наприклад, логи, JSON-документи, метадані).
  • Як часто ці дані змінюються і потребують оновлення?
  • Які вимоги до продуктивності, консистентності, масштабованості і затримок?
  • Чи потрібен аналіз великих даних?

Після чіткого розуміння вимог простіше обрати інструменти і підходи для реалізації гібридної архітектури.

Вибір підходящих інструментів

  • Для SQL бази даних часто обирають PostgreSQL, MySQL або MS SQL Server. Вони підходять для систем, де важливі транзакції і складні запити.
  • Для NoSQL бази даних вибір залежить від конкретних задач:
    • MongoDB: ідеальна для документно-орієнтованих даних.
    • Redis: відмінно підходить для кешування і швидкого доступу до даних.
    • Cassandra: використовується в розподілених системах для великих обсягів даних.

Огляд кращих практик

  • Залишайте SQL базу для критично важливих даних або операцій (наприклад, облік користувачів, фінансові транзакції).
  • Використовуйте NoSQL для зберігання менш критичних даних, таких як пошукові індекси, великі текстові дані, часові ряди або логи.
  • Переконайтеся, що у вас є чіткий план взаємодії між двома типами баз даних.

┌──────────────────────────────────────┬──────────────────────────────────┐
│ SQL                                  │ NoSQL                            │
├──────────────────────────────────────┼──────────────────────────────────┤
│ Транзакції (фінанси, замовлення)     │ Логи, аналітика, JSON             │
│ Складні запити                       │ Швидка обробка великих даних      │
│ Висока консистентність               │ Масштабованість                   │
└──────────────────────────────────────┴──────────────────────────────────┘

Налаштування і реалізація гібридної системи

Щоб гібридна архітектура працювала як єдине ціле, бази даних повинні бути налаштовані для взаємодії одна з одною.

Приклад налаштування з'єднань у FastAPI:


# Підключення до PostgreSQL
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

POSTGRES_URL = "postgresql://user:password@localhost:5432/mydatabase"
engine = create_engine(POSTGRES_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# Підключення до MongoDB
from motor.motor_asyncio import AsyncIOMotorClient

MONGO_URL = "mongodb://localhost:27017"
mongo_client = AsyncIOMotorClient(MONGO_URL)
mongo_db = mongo_client["my_mongo_database"]

Налаштування обміну даними

На практиці SQL і NoSQL бази даних можуть обмінюватися даними прямо через застосунок, використовуючи API або фреймворки для ETL (Extract, Transform, Load). Приклад використання:

Приклад запису даних з PostgreSQL в MongoDB:


async def sync_data_to_mongo():
    # Отримання даних з PostgreSQL
    db_session = SessionLocal()
    query = db_session.execute("SELECT * FROM user_data")
    users = query.fetchall()
    db_session.close()

    # Запис даних у MongoDB
    for user in users:
        await mongo_db["users"].insert_one({
            "id": user.id,
            "name": user.name,
            "email": user.email
        })

Важливим аспектом є моніторинг систем, щоб усі процеси і взаємодії відбувалися коректно. Рекомендую використовувати інструменти на кшталт Prometheus і Grafana для моніторингу.


Приклади з реального життя

Припустимо, у нас є інтернет-магазин.

  • SQL (PostgreSQL): використовується для керування транзакціями, каталогу товарів і облікових записів користувачів.
  • NoSQL (MongoDB): зберігає дані про поведінку користувачів, їх рекомендації і історію переглядів.

API-сервіс для отримання даних:


@app.get("/user/{user_id}")
async def get_user_data(user_id: int):
    # Отримання критичних даних з PostgreSQL
    db_session = SessionLocal()
    user_info = db_session.execute(f"SELECT * FROM users WHERE id = {user_id}").fetchone()
    db_session.close()

    # Отримання гнучких даних з MongoDB
    behavior_data = await mongo_db["user_behavior"].find_one({"user_id": user_id})
    
    return {
        "user_info": {
            "id": user_info.id,
            "name": user_info.name,
            "email": user_info.email
        },
        "behavior_data": behavior_data
    }

Інший приклад – система охорони здоров'я:

  • SQL (PostgreSQL): використовується для зберігання медичних записів і транзакційних даних.
  • NoSQL (Redis): зберігає тимчасові дані, такі як сесії авторизації або результати аналізів з IoT-пристроїв.

Архітектурна схема:


┌──────────────┐          ┌───────────────┐
│ PostgreSQL   │ <──API──>│ Додаток       │
│ (медичні     │          │               │
│  записи)     │          └───────────────┘
└──────────────┘
                               │
                               ▼
                         ┌──────────────┐
                         │ Redis        │
                         │ (тимчасові   │
                         │   дані)      │
                         └──────────────┘

Уроки з практики

  1. Розділяйте зони відповідальності: SQL для гарантованої консистентності, NoSQL – для гнучкості і швидкодії.
  2. Контролюйте синхронність даних: Забезпечте своєчасне оновлення даних між базами через cron-задачі, фонові задачі, такі як Celery.
  3. Оптимально розподіляйте ресурси: SQL – для критичних операцій, NoSQL – для високонавантажених сценаріїв.

Як уникнути помилок у гібридній архітектурі

  • Помилка 1: перевантаження однієї бази даних. Рішення: ретельно розділяйте завдання між SQL і NoSQL.
  • Помилка 2: проблеми синхронізації даних. Рішення: використовуйте черги повідомлень (наприклад, RabbitMQ або Kafka).
  • Помилка 3: низька продуктивність. Рішення: оптимізуйте запити і індексацію, налаштуйте кешування.

Приклад використання RabbitMQ для синхронізації:


import pika

# Відправлення повідомлення
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='sync_queue')

channel.basic_publish(
    exchange='',
    routing_key='sync_queue',
    body='Sync data from PostgreSQL to MongoDB'
)
connection.close()

Реалізація гібридної архітектури вимагає розуміння сильних і слабких сторін різних типів баз даних, чіткого розділення їхніх зон відповідальності та інтеграції системи в єдине ціле. З такими знаннями ти можеш створити збалансовану, продуктивну та масштабовану архітектуру!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ