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()

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

1
Задача
Модуль 4: FastAPI, 10 уровень, 6 лекция
Недоступна
Передача данных между базами данных
Передача данных между базами данных
1
Задача
Модуль 4: FastAPI, 10 уровень, 6 лекция
Недоступна
Интеграция и выборка из гибридной системы
Интеграция и выборка из гибридной системы
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Иван Уровень 84
15 декабря 2025
Вопрос - демонстрирует ли данный код уязвимость к SQL - injection? Или анотация типов спасает?

@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
    }