Обзор инфраструктуры

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

Стек веб-приложения

Flask — основа

Наш сайт построен на Flask, легковесном и гибком веб-фреймворке для Python. Flask обеспечивает базовую маршрутизацию, обработку запросов/ответов и систему Blueprint, которая организует наше приложение в модульные компоненты.

Ключевые возможности Flask, которые мы используем:

  • Blueprints: Организация приложения в логические модули (web, api, cart, product и т.д.)

  • Шаблонизатор Jinja2: Генерация HTML на стороне сервера с наследованием шаблонов

  • Контекст запроса: Автоматическая обработка HTTP-запросов и сессий

  • Werkzeug: Сервер для разработки и служебные функции

Приложение Flask инициализируется в модуле web, где мы:

  • Создаем Blueprint для веб-части

  • Инициализируем Babel для интернационализации

  • Настраиваем хранилище сессий Valkey

  • Настраиваем контекстные процессоры для переменных шаблонов

Gunicorn — продакшен-сервер

В продакшене мы используем Gunicorn (Green Unicorn), WSGI HTTP-сервер для Python. Gunicorn запускает наше Flask-приложение с несколькими рабочими процессами.

Gunicorn управляется systemd, что гарантирует его автоматический перезапуск в случае сбоя или перезагрузки сервера. Это обеспечивает высокую доступность без ручного вмешательства.

Nginx — обратный прокси и балансировщик нагрузки

Nginx выступает в роли нашего обратного прокси и балансировщика нагрузки. Он расположен перед Gunicorn и обрабатывает:

  • SSL/TLS termination: Шифрование/дешифрование HTTPS

  • Раздачу статических файлов: CSS, JavaScript, изображения (отдаются напрямую с диска)

  • Обратное проксирование: Перенаправление динамических запросов к Gunicorn

  • Ограничение скорости (Rate limiting): Защита от злоупотреблений

  • Сжатие запросов: Gzip-сжатие для более быстрой передачи

Ubuntu — операционная система

Все EC2-инстансы работают под управлением Ubuntu, выбранного нами дистрибутива Linux. Мы предпочитаем использовать пакеты Python от Ubuntu, когда это возможно, вместо pip.

Типичный поток запроса:

flowchart LR
    A[Браузер клиента] -->|HTTPS-запрос| B[Nginx]
    B -->|Проксировать к| C[Gunicorn]
    C -->|WSGI| D[Flask-приложение]
    D -->|Запрос| E[Кэш Valkey]
    E -->|Промах| F[DynamoDB]
    F -->|Ответ| E
    E -->|Попадание| G[Ответ]
    G --> B
    B -->|Ответ| A

CloudFront — сеть доставки контента (CDN)

CloudFront — наш CDN, обеспечивающий:

  • Защиту от DDoS: Встроенная защита от распределенных атак

  • Экранирование источника (Origin shielding): Защищает наши исходные серверы от всплесков трафика

Наш дистрибутив CloudFront имеет два источника (origin):

  • Бэкенд-сервер: Бэкенд-приложение на Flask

  • S3: S3-бакет для статических ресурсов

Настроенные политики кэширования (Cache behaviors):

  • /s/* — Статические ресурсы (CSS, JS, изображения) с TTL 24 часа

  • /ds/*.pdf — Технические описания (Datasheets) с TTL 24 часа

  • /api/* — API-эндпоинты без кэширования

  • /cart — Корзина с TTL 24 часа

  • /set-language — Без кэширования (динамический)

Уровень данных

DynamoDB — основная база данных

Мы используем Amazon DynamoDB в качестве основной базы данных. DynamoDB — это NoSQL база данных.

Наши таблицы DynamoDB включают:

  • Рекомендации (Recommendations): AI-генерируемые рекомендации товаров

  • Описания товаров (Product descriptions): Описания товаров на нескольких языках

  • Страницы запросов (Query pages): Разобранные страницы запросов для SEO

Мы используем PynamoDB, Pythonic ORM для DynamoDB, который предоставляет:

  • Определения моделей (Model definitions): Python-классы для таблиц базы данных

Valkey — кэш в оперативной памяти

Valkey (форк Redis) — наш слой кэша в оперативной памяти, обеспечивающий:

  • Хранение сессий (Session storage): Пользовательские сессии со скользящим сроком действия 30 дней

  • Часто запрашиваемые данные: Количество товаров, популярные запросы

  • Кэш автодополнения (Autocomplete): Поисковые подсказки

  • Манифест изображений (Image manifest): Расположение изображений товаров

Valkey обеспечивает значительные преимущества в производительности:

  • В 100 раз быстрее, чем DynamoDB для операций чтения

  • Сниженная нагрузка на БД: Попадания в кэш избегают запросов к DynamoDB

  • Сохранение сессий (Session persistence): Сессии на основе Valkey между запросами

Мы используем Valkey для:

  • Сессий: Состояние входа пользователя, данные корзины

  • Кэширования: Популярные запросы, подсказки автодополнения

  • Счетчиков (Counters): Количество товаров на складе (кэшируется для производительности)

  • Очередей (Queues): Фоновая обработка задач

S3 — объектное хранилище

Amazon S3 — наш сервис объектного хранения.

Мы используем S3 для:

  • Изображений товаров: Фотографии товаров в высоком разрешении

  • Технических описаний (Datasheets): PDF-спецификации товаров

  • Статических ресурсов: CSS, JS, изображения

DNS и маршрутизация

Route53 — управление доменами

Route53 управляет нашей DNS:

  • Регистрация доменов: thinvent.in и связанные домены

Маршрутизация Nginx

Nginx маршрутизирует запросы на основе шаблонов URL:

  • / → Flask-приложение (главная, товары, корзина, оформление заказа)

  • /q/ → Flask-приложение (страницы запросов, результаты поиска)

  • /api/ → Flask-приложение (API-эндпоинты)

  • /static/ → CloudFront/S3 (статические ресурсы)

Инфраструктура поиска и ИИ

Сервис поиска

Мы запускаем отдельное Flask-приложение для функциональности поиска. Этот сервис предоставляет:

  • Векторный поиск (Vector search): Семантическое сходство для связанных запросов

  • Автодополнение (Autocomplete): Подсказки поиска на основе префикса

  • Популярные запросы (Popular queries): Самые искомые термины

  • Извлечение фильтров (Filter extraction): Разбор поисковых запросов для аспектов (facets)

Сервис поиска использует:

  • Valkey RediSearch: Векторный поиск по сходству

  • SentenceTransformer: Генерация эмбеддингов

  • Соответствия фраз (Phrase mappings): Извлечение фильтров через сопоставление подстрок

Провайдеры ИИ

Мы используем нескольких провайдеров ИИ для различных задач:

DeepSeek

  • Модель: deepseek-chat

  • Варианты использования: Описания товаров, контент страниц запросов, перевод

  • API: DeepSeek API с резервным вариантом Together.ai

  • Кэширование: Системные промпты для эффективности кэширования промптов

Gemini

  • Модель: Gemini (конкретная модель)

  • Варианты использования: Генерация контента

  • Интеграция: Прямые вызовы API

Amazon Bedrock

  • Модели: Nova Pro

  • Варианты использования: Внутренний чат

  • Интеграция: boto3 SDK

Amazon Bedrock

  • Модели: Nova Lite

  • Варианты использования: Чат-бот для клиентов

  • Интеграция: boto3 SDK

Полный поток запроса

Вот как типичный запрос проходит через нашу инфраструктуру:

flowchart TD
    A[Браузер клиента] -->|DNS-запрос| B[Route53]
    B -->|IP-адрес| C[CloudFront]
    C -->|Проверка кэша| D{Попадание в кэш?}
    D -->|Да| E[Вернуть закэшированный контент]
    D -->|Нет| F[Nginx]
    F -->|Прокси| G[Gunicorn]
    G -->|WSGI| H[Flask-приложение]
    H -->|Проверка кэша| I[Valkey]
    I -->|Попадание| J[Вернуть закэшированные данные]
    I -->|Промах| K[DynamoDB]
    K -->|Запрос| L[Вернуть данные]
    L --> I
    J --> M[Сформировать ответ]
    E --> M
    M --> N[Отправить клиенту]

Мониторинг и работоспособность

UptimeRobot — внешний мониторинг

Мы используем UptimeRobot для внешнего мониторинга всех публично доступных эндпоинтов:

  • Бэкенд-сервер (Backend server): Бэкенд веб-сайта

  • www.thinvent.in: Публичный веб-сайт

Проверки работоспособности (Health Checks)

  • Gunicorn: systemd управляет перезапусками

  • Flask: Эндпоинт /health возвращает статус

  • Valkey: Мониторится состояние соединения

  • DynamoDB: Мониторятся задержка и пропускная способность

Логирование

  • Логи приложения (Application logs): Gunicorn error.log

  • Логи доступа (Access logs): Gunicorn access.log

  • Email: Уведомления в реальном времени о критических событиях с трассировками стека Python

Итог

Наша инфраструктура разработана для:

  • Производительности: Многоуровневое кэширование, CDN, оптимизированные запросы

  • Масштабируемости: Автомасштабируемые базы данных, балансировка нагрузки

  • Экономической эффективности: Оплата по факту использования, кэширование для снижения нагрузки на БД

Комбинация Flask, Gunicorn, Nginx, Ubuntu, DynamoDB, Valkey, CloudFront и UptimeRobot обеспечивает надежную, масштабируемую основу для нашей платформы электронной коммерции.

Связанные статьи