Вопрос с собеседования · Spring

Какие основные backend-риски у GraphQL?

SeniorSpring Batch и IntegrationSpring
Ещё спрашивают так:
  • Какие проблемы GraphQL на бэкенде?
Коротко

Клиент сам составляет запрос, поэтому риски на бэкенде: N+1 в резолверах, дорогие и глубокие запросы (DoS одним запросом), сложное кэширование (всё через POST на один URL), авторизация на уровне полей.

  • N+1 — DataLoader (батчинг): в Spring for GraphQL — @BatchMapping
  • Ограничение глубины и сложности запроса, таймауты, лимиты
  • Персистентные запросы — сервер принимает только заранее известные

А ещё Авторизация — в каждом резолвере или на уровне схемы, а не только на входе

Подробно

N+1 в резолверах. Запрос списка заказов с полем customer вызывает резолвер customer для каждого заказа — 100 запросов к базе. Решение — DataLoader: собрать ключи всех заказов и загрузить клиентов одним запросом. В Spring for GraphQL — @BatchMapping.

Дорогие запросы. Клиент может запросить вложенность на 10 уровней (user → friends → friends → ...) или огромные списки. Один запрос кладёт сервер. Защита: ограничение глубины (MaxQueryDepthInstrumentation), оценка сложности с лимитом, обязательная пагинация списков, таймауты, rate limiting по стоимости запроса, а не по числу запросов.

Кэширование. Запросы обычно идут POST на /graphql — HTTP-кэш и CDN не работают. Помогают персистентные запросы (хеш вместо текста, GET), кэширование на уровне резолверов и данных.

Авторизация. Одна точка входа, а данные разной чувствительности — проверки нужны на уровне полей и объектов. Ещё риск — интроспекция схемы в проде (раскрывает API) и подробные ошибки.

Наблюдаемость. Все запросы на один URL с кодом 200 — метрики нужно собирать по операциям и полям.

Что хотят услышать

  • N+1 и DataLoader.
  • Защита от дорогих запросов.
  • Кэширование и авторизация на уровне полей.

Частые ошибки

  • Выставлять GraphQL наружу без ограничений глубины и сложности.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Невозможность выбрать конкретные поля ответа
  • ✗Только один запрос за раз на клиента
  • ✓N+1 на резолверах, авторизация полей и слишком глубокие запросы
  • ✗Полное отсутствие типизации схемы, из-за чего ошибки видны только в рантайме

Что спросят дальше

  • Что такое DataLoader?
  • Когда REST проще GraphQL?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования