Юрий Белк – Full stack Developer (страница 28)
– metadata (JSON: старые/новые значения, ip, user-agent и т.п.)
Где хранить
Для учебного проекта:
– отдельная таблица в основной БД – нормально.
В больших системах:
– иногда события идут в отдельное хранилище/лог-систему.
Тонкий момент: PII
Если у вас есть персональные данные, не пишите в аудит лишнее.
Например, пароль и токены – никогда.
Email – можно, но лучше как идентификатор, не как “лог всего”.
7.4. Pagination: cursor vs offset (сравнение и выбор)
Списки задач, комментариев, проектов – это обязательно пагинация.
Есть два основных подхода:
– Offset pagination: limit=20&offset=40
– Cursor pagination: limit=20&cursor=…
Offset pagination
Плюсы:
– простая для понимания,
– легко прыгать на “страницу 5”.
Минусы:
– на больших данных может быть медленнее (offset заставляет БД “пропускать” строки),
– нестабильность при изменениях: если между запросами добавили записи, страница “поплывёт”.
Cursor pagination
Плюсы:
– стабильнее при добавлениях/удалениях,
– обычно лучше по производительности на больших объёмах,
– идеально подходит для “бесконечной ленты”.
Минусы:
– сложнее для клиентов,
– “страница 5” как концепция исчезает (есть только “вперёд/назад”, если реализовано).
Что выбираем для TaskFlow
Реалистичный выбор:
– для задач и комментариев: cursor pagination
– для простых справочников (labels, members) можно offset, но лучше быть последовательными
Cursor обычно строится на:
– (created_at, id) как “ключ сортировки”
– курсор кодируется в base64 и передаётся как строка
Пример сортировки:
– “новые сверху”: сортируем по created_at DESC, id DESC
– курсор хранит последнюю запись текущей страницы
7.5. SLA и Observability (наблюдаемость)
Что такое SLA в нашем контексте
SLA обычно формализуют в процентах доступности (“99.9%”). Для учебного проекта важнее другая мысль:
> Мы должны уметь доказать, что сервис жив, и быстро понять, если он болен.
Минимальные SLO (цели) для API:
– p95 latency для основных endpoint’ов, например < 300–500 мс (условно)
– error rate < 1%
– доступность (uptime) по health-check
Что нужно из observability
Минимальный набор, который стоит закладывать:
– структурированные логи (JSON, с request_id)
– метрики (количество запросов, latency, коды ответов)
– трассировка (trace_id) – опционально, но полезно
Обязательные практики:
– request_id генерируется на входе и прокидывается дальше
– логируем: метод, путь, статус, время обработки, user_id (если есть), workspace_id (если есть)
Health checks
Обычно:
– /health – быстрый, без БД (жив ли процесс)
– /ready – проверка зависимостей (БД доступна, миграции применены)
Нюанс: readiness не должен “ддосить” базу. Проверки должны быть лёгкими.
7.6. Мини-итог главы
Мы договорились о вещах, которые делают API взрослым:
– ограничиваем частоту,
– защищаемся от повторов,