GraphQL: схема, резолверы и проблема N+1
GraphQL даёт клиенту выбирать форму ответа, но переносит сложность на backend.
Почему это важно: GraphQL популярен у фронтенда, но плохо реализованный сервер легко уходит в N+1 запросы и становится медленнее REST.
Главная идея
Клиент описывает нужные поля в query, сервер собирает их через резолверы, оптимизируя загрузку данных.
Как это выглядит на практике
- Frontend пишет query: { user(id: 42) { name, posts { title } } }.
- GraphQL-сервер парсит query, вызывает резолверы для user и posts.
- Без оптимизации каждый post вызывает отдельный запрос (N+1).
- 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 — это контракт, а не магия.
Термины урока
Связь с работой backend-разработчика
GraphQL — мощный инструмент для frontend, но требует серьёзной дисциплины на backend, иначе превращается в performance-кошмар.
Мини-разбор реальной ситуации
Команда добавила GraphQL поверх существующих REST-эндпоинтов. Без DataLoader загрузка списка из 100 объектов делала 1000 запросов в БД. После добавления батчинга — 5 запросов.
Что запомнить
- DataLoader — обязателен.
- Ограничивайте сложность query.
- GraphQL = контракт + резолверы + оптимизация.
Итог
GraphQL — это инструмент, который меняет распределение сложности между frontend и backend, и требует осознанного выбора.
Комментарии к уроку
Войдите, чтобы оставить комментарий.
Пока нет комментариев — будьте первым.