Сравните REST, gRPC и GraphQL. Когда что выбрать?
Короткий ответ
- REST — ресурсы поверх HTTP/JSON, прост и универсален
- gRPC — бинарный Protobuf поверх HTTP/2, строгий контракт, стриминг
- GraphQL — клиент сам описывает нужные поля одним запросом
- REST для публичных API, gRPC для межсервисного общения
- GraphQL хорош для фронтендов с разными потребностями в данных
- У GraphQL сложнее кэширование и защита от тяжёлых запросов
REST — универсальный дефолт, gRPC — быстрый внутренний транспорт, GraphQL — гибкая выдача данных фронтенду.
Как сказать вслух
пример ответаREST — это ресурсы и стандартные методы HTTP с JSON, его понимает любой клиент, поэтому он хорош для публичных API. gRPC использует бинарный Protobuf и HTTP/2 — он быстрее, даёт строгий контракт и кодогенерацию, поэтому его обычно берут для общения микросервисов между собой. GraphQL позволяет клиенту запросить ровно те поля, что нужны, одним запросом — это удобно, когда много разных фронтендов. Но у него сложнее кэширование и нужно защищаться от слишком тяжёлых запросов.
Подробный ответ
Основной ответ
REST строится вокруг ресурсов и семантики HTTP: простота, читаемость, кэширование на уровне HTTP, но фиксированная форма ответов ведёт к over- и under-fetching. gRPC — RPC-фреймворк с контрактом в Protobuf, бинарной сериализацией и HTTP/2: мультиплексирование, двунаправленный стриминг, кодогенерация клиентов, низкие накладные расходы — отличный выбор для внутренних вызовов между сервисами; минус — браузеры требуют gRPC-Web, отладка глазами сложнее. GraphQL даёт клиенту язык запросов к графу данных: одна точка входа, клиент выбирает поля, схема типизирована и интроспективна. Цена — резолверы порождают проблему N+1, HTTP-кэширование почти не работает (всё POST на один endpoint), нужны лимиты глубины и стоимости запросов.
Ключевые моменты
- Контракт и эволюция. В gRPC и GraphQL схема — часть протокола, ломающие изменения видны сразу. В REST контракт держится на OpenAPI и дисциплине команды.
- Производительность. Protobuf компактнее JSON, HTTP/2 мультиплексирует запросы — на внутреннем трафике с тысячами RPS разница ощутима.
- Over-fetching. REST отдаёт весь ресурс целиком, GraphQL — только запрошенные поля. Для мобильных клиентов с дорогим трафиком это аргумент.
- Кэширование. REST дружит с HTTP-кэшами и CDN из коробки; GraphQL требует кэшировать на уровне клиента или persisted queries.
Практический контекст
Типичная продакшен-схема: наружу — REST (или GraphQL-гейтвей, если фронтендов много и они разные), внутри между сервисами — gRPC. Интервьюер ждёт не «что лучше», а осознанных критериев выбора: кто потребители, какой трафик, как эволюционирует схема, что с кэшированием и инструментами. Хороший знак — упомянуть реальные минусы каждого подхода, а не только маркетинговые плюсы.
Частые ошибки
- Называют GraphQL «заменой REST», не упоминая проблемы кэширования и N+1
- Не знают, что gRPC не работает в браузере напрямую без gRPC-Web
- Выбирают технологию по моде, а не по профилю потребителей API