Learning Platform
Глоссарий Troubleshooting
Урок 11.03 · 30 мин
Начальный
RESTGraphQLgRPCArchitectureAPI DesignTrade-offs

REST, GraphQL, gRPC: когда что выбрать

Тройка REST, GraphQL и gRPC — не «лучший» против «худшего», а три разных набора компромиссов. Зрелая команда часто использует все три одновременно: REST смотрит наружу, GraphQL агрегирует для UI, gRPC общается между сервисами. В этом уроке — таблица для сравнения, decision tree и реальные паттерны.

Сравнительная таблица по 12 критериям

КритерийRESTGraphQLgRPC
Формат payloadJSON (чаще), XML, MessagePackJSONProtobuf (бинарный), опционально JSON
ТранспортHTTP/1.1, HTTP/2, HTTP/3HTTP/1.1+; WebSocket для subscriptionsТолько HTTP/2 (HTTP/3 — экспериментально)
Schema-firstОпционально (OpenAPI)Обязательно (SDL)Обязательно (.proto)
ТипизацияСлабая по умолчанию, через OpenAPI — сильнаяСильная (schema валидируется runtime)Сильная (compile-time через codegen)
Размер payloadБазовая линия (1x)0.7-1x от REST0.1-0.3x от REST
Latency на 1 RPCНизкая (HTTP/2 + JSON ~5ms)Низкая, но overhead парсинга ASTСамая низкая (бинарный + HTTP/2)
Browser supportПолный, нативноПолный (через POST или GET)Частичный, нужен gRPC-Web
Tooling/debugcurl, Postman, браузер DevToolsGraphiQL, Apollo Studio, codegengrpcurl, BloomRPC, Wireshark
Кривая обученияНизкаяСредняя (resolvers, N+1, fragments)Средняя-высокая (proto, codegen, HTTP/2)
HTTP-кэшированиеИз коробки (GET + ETag/Cache-Control)Сложное — всё POST, нужен app-level cacheНет нативной поддержки
StreamingSSE (server-only), отдельный WebSocketSubscriptions через WebSocket/SSEНативно: server/client/bidi
Use casePublic API, integrations, CRUDBFF, mobile, разнообразные клиентыInternal microservices, ML, observability

Каждая ячейка — упрощение, но даёт ощущение порядка величин. Размер payload-а особенно показателен: на типичном сообщении в 200 полей gRPC даст 1-3 KB, REST/JSON — 8-15 KB, GraphQL подберёт что-то посередине благодаря фильтрации полей.

HTTP/3 и QUIC: следующее поколение транспорта

Decision tree

Какой протокол выбрать

Где живут клиенты?

Старт: появилась задача спроектировать API между двумя системами
Снаружи (партнёры, публичные интеграции)

REST + OpenAPI 3.1

Партнёры ожидают REST OpenAPI с примерами в curl, Postman и привычными статус-кодами
Внутри организации

Кто потребитель?

Внутренние микросервисы -- выбор зависит от того, кто конечный потребитель: backend или браузер

SPA / Mobile UI

Браузерный SPA или мобильное приложение с разными экранами и переменчивыми требованиями
GraphQLФронт сам выбирает форму данных, легко агрегирует несколько источников

Service-to-service

Высокий QPS, минимальная latency, оба конца под нашим контролем
gRPCБинарный, типизированный, streaming, идеально для service mesh

Простой CRUD

Простые CRUD сервисы с маленькой командой и без сильной нагрузки
RESTREST остаётся самым простым выбором, когда нет специальных требований

Decision tree не строгий закон, а отправная точка. В реальности добавляются ещё измерения: совместимость с существующим стеком (если уже есть Apollo Federation — расширять её дешевле), требования compliance, навыки команды.

Гибридные архитектуры

Большинство production-систем используют все три парадигмы одновременно. Типовая раскладка:

                 [ Внешние клиенты, партнёры ]
                            |
                       REST + OpenAPI
                            |
                    +--------------+
                    |  API Gateway  |
                    +--------------+
                            |
                       GraphQL BFF
                            |
        +-------------------+-------------------+
        |                   |                   |
     gRPC                 gRPC                 gRPC
        |                   |                   |
   [Order svc]         [Catalog svc]      [User svc]
        |                   |                   |
     gRPC                 gRPC                 gRPC
        |                   |                   |
   [ML inference]    [Search index]      [Auth provider]

Каждый слой подобран под свой сценарий:

  • REST наружу — стабильный контракт, OpenAPI-документация, кэширование на CDN, дружба с CORS.
  • GraphQL для UI — мобильный и веб-фронт получают ровно те данные, что нужны конкретному экрану. BFF агрегирует ответы от микросервисов.
  • gRPC внутри — низкая latency, типизированные контракты, streaming для аналитики и ML.

В DE-сценариях встречается другая раскладка: REST для внешних SaaS-источников (Stripe, Salesforce), GraphQL для админских dashboard-ов (Hasura поверх Postgres), gRPC для внутренней передачи метрик и моделей.

Поток данных в DE-pipeline-е с тремя протоколами

SaaS источник (REST)

Salesforce REST API: GET /sobjects/Account?since=2026-05-14
REST poll

Ingest worker

Airflow DAG, Python ingest task

Stream platform (Kafka)

Запись в Kafka, метрики в Prometheus через OTLP gRPC
gRPC OTLP

OTel Collector

OpenTelemetry Collector принимает spans/metrics через gRPC

Аналитический storage

ClickHouse, S3 + Parquet, Snowflake
GraphQL

Дашборд (GraphQL)

Hasura или Apollo BFF поверх Postgres metadata + ClickHouse аналитики

Антипаттерны

Опытным взглядом видны типовые ошибки выбора протокола.

GraphQL для классического CRUD

Сервис из 5 endpoint-ов, два из которых GET-list и GET-by-id, один POST-create, один PUT-update, один DELETE. Команда внедряет GraphQL — и получает overhead в виде schema, codegen, N+1 риска и потери HTTP-кэширования. REST с OpenAPI решит ту же задачу в 3 раза меньшим объёмом кода.

gRPC через интернет наружу

Предложить публичной интеграции gRPC означает: партнёрам нужен HTTP/2-совместимый клиент, gRPC-кодген на их языке, проблемы с корпоративными прокси, отсутствие удобного браузерного debugger-а. Большинство партнёров просто откажется. gRPC живёт внутри организации; на границе ставят REST или GraphQL gateway.

REST с глубокой вложенностью для мобильных

API, требующее 8 запросов на отрисовку одного экрана и возвращающее 30 полей вместо нужных 4, — типичный сигнал, что пора рассмотреть GraphQL BFF. На медленной мобильной сети каждый round trip ощутим.

Schema-first без дисциплины

Проект на gRPC, в котором .proto файлы хранятся в монорепе, но никто не следит за breaking changes. Через год — десятки конфликтов tag-ов, удалённых полей и сломанных клиентов. Решение: автоматический lint (buf для proto), policy против изменения tag-ов, контракт-тесты.

GraphQL без ratelimit-а и query complexity

Открытый GraphQL endpoint, на котором клиент может прислать запрос с глубиной вложенности 50 и cartesian product через repeated. Сервер положит БД одним запросом. Защита: лимит глубины, лимит сложности (graphql-cost-analysis), persisted queries (только заранее одобренные тексты), rate limit per token.

WARNING

Самая частая ошибка — выбирать протокол по моде, а не по требованиям. «У нас же микросервисы, давайте gRPC» без анализа QPS и команды приводит к месяцам потерянной продуктивности. Выбирайте под конкретные ограничения: latency, тип клиентов, объём команды, навыки.

Реальные примеры компаний

  • Netflix. GraphQL Federation как BFF для всех экранов (TV, mobile, web). Под капотом — REST и gRPC сервисы, GraphQL слой агрегирует. Доклад «How Netflix Scales its API with GraphQL Federation» — обязателен к просмотру.
  • Shopify. Storefront API — GraphQL для headless commerce. Admin API в 2026 уже на 90% переехал с REST на GraphQL, REST остался как deprecated fallback.
  • GitHub. REST API v3 + GraphQL API v4 параллельно. Новые фичи доступны раньше через GraphQL. Webhooks для событий.
  • Stripe. REST + Webhooks как фундамент. Никакого GraphQL — стабильность контракта дороже гибкости.
  • Google. gRPC внутри (его и придумали). Снаружи — REST через transcoding, который автоматически генерирует REST-обёртку из .proto.
  • Uber. gRPC + Protobuf для service-to-service (десятки тысяч сервисов). REST на edge, GraphQL для мобильного rider/driver приложения.
  • Apollo (Apollo Studio). Сами на себе: GraphQL Federation для собственного API, REST в редких случаях для legacy.

Эволюция со временем

Большинство компаний начинают с REST, потому что он простой и весь мир его понимает. По мере роста:

  1. Появляется второй клиент (мобильное приложение). REST с overfetching становится узким местом — добавляется GraphQL BFF.
  2. Микросервисы множатся, latency между ними растёт. Внутренняя коммуникация переезжает на gRPC.
  3. Real-time сценарии (notifications, чаты, телеметрия) — добавляются gRPC streaming или WebSocket.
  4. Public API остаётся REST — потому что партнёрам так удобно, и менять контракт уже дорого.

Это эволюционный путь, а не революция. Ни одна крупная компания не переводит всё на один протокол — это нерентабельно и ломает экосистему интеграций.

Memo для junior DE

Что нужно знать практически:

  • Чтение OpenAPI и .proto — обязательный навык. Если в команде уже есть Apollo Federation — добавить туда тип Python data sources.
  • Уметь сделать выгрузку через REST (httpx) и GraphQL (httpx + POST с query). Уметь сгенерировать gRPC stub из .proto.
  • Понимать стоимость: сколько RPS выдержит endpoint, какова latency, есть ли batch-endpoint.
  • Различать сценарии: внешний источник = почти всегда REST/GraphQL; внутренние сервисы — gRPC или REST в зависимости от компании.
Проверка знанийKnowledge check
Стартап делает marketplace. У них: 1) публичное API для merchant-ов (создание заказов), 2) мобильное приложение для покупателей с экраном профиля + список заказов + отзывы, 3) внутренний ML-сервис рекомендаций, который вызывают 200 раз в секунду. Какие три протокола вы предложите и почему?
ОтветAnswer
Три протокола под три разных контекста. (1) Публичное API для merchant-ов -- REST + OpenAPI 3.1. Партнёры ожидают понятный HTTP-контракт, кэширование, привычные статус-коды, документацию в Swagger UI и примеры curl. gRPC через интернет наружу почти всегда антипаттерн (нужен gRPC-Web, проблемы с корпоративными прокси), GraphQL для CRUD создания заказов даёт overhead без выгод. (2) Мобильное приложение -- GraphQL BFF. На экране профиля нужны разные подмножества данных user + orders + reviews; REST потребует 4-5 запросов и overfetching, GraphQL отдаст один POST с минимальной payload. Особенно ценно на медленной мобильной сети. Защита: persisted queries, query complexity limit, DataLoader для борьбы с N+1. (3) Внутренний ML-сервис -- gRPC + Protobuf. 200 RPS с requirements на низкую latency и большие тензоры на входе/выходе делают бинарный Protobuf на 5-10x меньше JSON, HTTP/2 мультиплексирует потоки, типизированные клиенты предотвращают рассинхронизацию контракта. Triton/TF Serving сразу дают gRPC-интерфейс. Bonus -- если рекомендации стримятся (по мере прокрутки ленты), bidirectional streaming gRPC даст низкую latency без накладных расходов на keep-alive.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 4. Команда строит публичное API для партнёров (создание заказов, получение статусов). Какой протокол выбрать?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 3