Гайды
GraphQL vs REST: когда что лучше
Матрица кэша и версий, BFF, безопасность и rate limit, компромиссы для публичного и внутреннего API.
~8 мин чтения
GraphQL vs REST: когда что лучше
REST — ресурсы и HTTP-методы; GraphQL — одна точка входа и декларативный запрос дерева. Оба валидны; выбор зависит от клиентов, команды и нагрузки. Детали GraphQL — Основы GraphQL: схема и резолверы; REST-дизайн — HATEOAS и версионирование; контракты — OpenAPI и генерация клиентов.
1. Краткая матрица
| Критерий | GraphQL | REST |
|---|---|---|
| Гранулярность полей | Клиент сам выбирает поля | Часто «фиксированные» DTO или over/under-fetch |
| Кэширование HTTP | Сложнее (POST + тело) | Естественно GET + URL |
| Версионирование | Схема, deprecated поля | URL /v2/, заголовки |
| Инструменты | Playground, Apollo Studio | OpenAPI, Swagger — см. документация в FastAPI |
| Серверная сложность | DataLoader, лимиты, N+1 | Проще для простых CRUD |
2. Когда GraphQL уместен
- Много клиентов (web, mobile, партнёры) с разными наборами полей.
- Сложные агрегированные экраны без лавины специализированных REST-эндпоинтов.
- Команда готова инвестировать в производительность и безопасность схемы.
3. Когда REST (или гибрид) проще
- Кэш на CDN/прокси по GET критичен.
- Загрузка файлов, бинарные потоки, простые вебхуки.
- Команда маленькая, домен — классический CRUD.
Частый компромисс: REST для публичного API и файлов, GraphQL для внутреннего BFF (Backend for Frontend).
4. BFF-паттерн
Отдельный GraphQL-слой перед микросервисами собирает данные для фронта, не заменяя внутренние REST/gRPC между сервисами.
5. Безопасность
GraphQL — один URL; rate limiting и query cost обязательны. REST проще режет по path+method в WAF.
Persisted queries (хэш запроса вместо произвольного тела) и APQ (Automatic Persisted Queries) уменьшают поверхность атаки и помогают кэшировать на CDN для GET-запросов с queryId — компромисс между гибкостью ad-hoc GraphQL и предсказуемостью для edge.
6. Решение
Зафиксируйте требования к кэшу, типизации клиентов, команде и наблюдаемости. Не внедряйте GraphQL «ради моды» без инженеров, которые чинят N+1.
7. Пагинация и лимиты
Relay connections (first/after) или лимиты глубины/количества полей в query complexity плагинах — иначе один запрос может положить БД. Для публичного API документируйте дефолтные лимиты и коды ошибок.
8. Наблюдаемость
Логируйте operationName (не только в dev), разделяйте ошибки резолверов и транспорта. Трассировка — OpenTelemetry; корреляция с логами по trace_id.
9. Миграции схемы
@deprecated с reason и сроком, schema registry в CI (graphql-inspector, Spectral). Для мобильных клиентов планируйте долгий хвост старых версий приложения.
Дальше: REST: принципы и версии · тег GraphQL