Продвинутый

GraphQL: схема, резолверы и проблема N+1

Урок 3 из 3 в курсе gRPC и GraphQL: альтернативы REST

Содержание курса (3/3)

GraphQL: схема, резолверы и проблема N+1

GraphQL даёт клиенту выбирать форму ответа, но переносит сложность на backend.

Почему это важно: GraphQL популярен у фронтенда, но плохо реализованный сервер легко уходит в N+1 запросы и становится медленнее REST.

Главная идея

Клиент описывает нужные поля в query, сервер собирает их через резолверы, оптимизируя загрузку данных.

Как это выглядит на практике

  1. Frontend пишет query: { user(id: 42) { name, posts { title } } }.
  2. GraphQL-сервер парсит query, вызывает резолверы для user и posts.
  3. Без оптимизации каждый post вызывает отдельный запрос (N+1).
  4. DataLoader группирует запросы и решает проблему.

Что происходит под капотом

  • Schema (SDL): описание типов, запросов и мутаций.
  • Resolver: функция, которая возвращает данные для поля.
  • DataLoader: батчинг и кеширование запросов в одном request scope.
  • Persisted queries: предзаписанные queries для безопасности и кеширования.

Типичные ошибки и заблуждения

  • Ошибка: GraphQL автоматически оптимизирует запросы. Без DataLoader N+1 неизбежен.
  • Ошибка: GraphQL заменяет REST везде. Часто GraphQL — это gateway над REST/gRPC.
  • Ошибка: GraphQL не нужно версионировать. Эволюция схемы требует deprecate-and-remove.
  • Ошибка: открытый GraphQL безопасен. Атакующие могут составлять очень тяжёлые запросы.

Ключевые выводы

  • Клиент выбирает форму ответа.
  • DataLoader обязателен для производительности.
  • Глубину и сложность query надо ограничивать.
  • GraphQL — это контракт, а не магия.

Термины урока

Schema: описание типов и операций GraphQL API.
Resolver: функция, возвращающая значение поля.
DataLoader: батчер запросов для решения N+1.
Query depth limit: ограничение вложенности запросов.

Связь с работой backend-разработчика

GraphQL — мощный инструмент для frontend, но требует серьёзной дисциплины на backend, иначе превращается в performance-кошмар.

Мини-разбор реальной ситуации

Команда добавила GraphQL поверх существующих REST-эндпоинтов. Без DataLoader загрузка списка из 100 объектов делала 1000 запросов в БД. После добавления батчинга — 5 запросов.

Что запомнить

  • DataLoader — обязателен.
  • Ограничивайте сложность query.
  • GraphQL = контракт + резолверы + оптимизация.

Итог

GraphQL — это инструмент, который меняет распределение сложности между frontend и backend, и требует осознанного выбора.

Комментарии к уроку

Войдите, чтобы оставить комментарий.

Пока нет комментариев — будьте первым.