[Backend-разработка · Базы данных · Архитектура ПО]
Архитектура бэкенда и хранение данных
Серверная архитектура, на которой держится платформа: аккаунты, сигналы, настройки, состояния, фоновые задачи, доступ, отчёты и мониторинг — развитие без переписывания.
01Обзор проекта
От этого слоя зависят все остальные кейсы на сайте. Он хранит пользователей, сигналы, настройки и состояния, запускает фоновые процессы, общается с внешними API и доставляет информацию в Telegram и веб-интерфейсы.
Акцент — на контролируемом развитии: добавлять функции и исправлять ошибки в системе, где уже много движущихся частей, с проверкой каждого изменения до продакшена.
02Инженерная задача
Когда много подсистем используют одну базу и работают параллельно, сложными становятся согласованность, обработка сбоев и управление изменениями — а не отдельные функции.
- A
Сохранять согласованность состояния между действиями пользователей и фоновыми процессами.
- B
Обрабатывать некорректные или неполные данные от внешних сервисов.
- C
Планировать фоновые операции без наложений и потери работы.
- D
Делать каждое важное событие прослеживаемым по логам.
03Архитектура решения
Наведите или нажмите на этап.
Внешние API
Биржи, Telegram, AI-провайдеры и другие сервисы.
Мониторинг и журналы событий наблюдают за каждым этапом.
04Основные компоненты
- 01
Модель данных
SQL-таблицы и связи для аккаунтов, сигналов, настроек, состояний и истории событий.
- 02
Сервисный слой
Асинхронные Python-сервисы, инкапсулирующие бизнес-логику и внешние интеграции.
- 03
Воркеры
Фоновые процессы для задач по расписанию и долгих операций.
- 04
Проверки целостности
Валидация входных данных и инвариантов перед записью.
- 05
Логирование событий
Структурированные логи, связывающие действия пользователей и фоновую работу.
- 06
Доставка
Эндпоинты и сообщения, доставляющие результаты в Telegram и веб-интерфейсы.
05Технологический стек
Ядро
- Python
- async / await
- aiohttp
Данные
- SQL
- SQLite
- Data modeling
Эксплуатация
- Linux VPS
- Background processes
- Structured logging
06Интерактивная демонстрация
Путь запроса через бэкенд
ИллюстрацияИллюстративное демо. Отправьте запрос через слои и добавьте сбой, чтобы увидеть, как ошибки обрабатываются и логируются.
$ tail -f app.log
Мониторинг
- обработано
- 0
- дедуплицировано
- 0
- повторов
- 0
- отклонено (невалидно)
- 0
- сбой → алерт
- 0
07Инженерные решения
- 01
Развивать, а не переписывать
Изменения вносятся постепенно за чёткими границами, проверяются и только потом расширяются.
- 02
Проверять до сохранения
Плохие данные останавливаются на слое логики, поэтому база остаётся надёжным источником истины.
- 03
Идемпотентная фоновая работа
Воркеры можно безопасно перезапустить после прерывания без дублирования эффектов.
- 04
Логи как часть продукта
Структурированные, связанные логи делают поведение в продакшене объяснимым.
08Надёжность и тестирование
- Проверка изменений относительно текущего поведения до деплоя.
- Дедупликация событий и идемпотентная обработка.
- Обработка ошибок вокруг каждой внешней зависимости.
- Проверка фактического поведения в продакшене после деплоя.
09Пример кода
import sqlite3
from datetime import datetime, timezone
def process_event(db: sqlite3.Connection, event_id: str, source: str, kind: str) -> bool:
"""Returns True if processed now, False if it was already handled."""
try:
with db: # one transaction: mark + apply, or neither
db.execute(
"INSERT INTO processed_events (event_id, source, event_type, processed_at) "
"VALUES (?, ?, ?, ?)",
(event_id, source, kind, datetime.now(timezone.utc).isoformat()),
)
apply_side_effects(db, event_id, kind)
return True
except sqlite3.IntegrityError:
return False # duplicate delivery — safe to ignore
def apply_side_effects(db: sqlite3.Connection, event_id: str, kind: str) -> None:
...Иллюстрация Иллюстративный инженерный пример — идемпотентная обработка событий в SQLite.
Исходный код продукта закрыт. Примеры показывают инженерный подход, а не внутреннюю логику. Больше — в Engineering Lab.
10Возможное развитие
- Переход на PostgreSQL при необходимости более высокой конкурентной записи.
- Эндпоинт метрик для глубины очереди и длительности задач.
- Контрактные тесты для эндпоинтов, которые используют интерфейсы.