REST vs SOAP vs gRPC vs GraphQL: гайд для системного аналитика

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем сравнение спрашивают

На собесе SA в банке/ритейле/телекоме часто звучит: «вам приходит требование интеграции с поставщиком — поставщик предлагает SOAP, ваш стек REST. Что описываете в ТЗ?» или «как обоснуете выбор gRPC между микросервисами вместо REST?». Это не теоретический вопрос — аналитик должен уметь обосновать выбор, понимать риски и описать в ТЗ.

Главная боль без понимания протоколов — кандидат на каждый вопрос отвечает «REST», даже когда контекст требует другого. На банковском собесе в финтехе это закрывает кандидату дверь, потому что банковские интеграции — это половина SOAP, треть REST, остальное gRPC/файловый обмен.

Эта статья даёт базовую матрицу выбора, без неё сложно проходить SA-собесы middle+.

REST

REST — архитектурный стиль над HTTP. Ресурсы (existeentities), URI — адреса ресурсов, методы (GET/POST/PUT/PATCH/DELETE) — действия.

GET /users/123
POST /orders
{
  "user_id": 123,
  "amount": 1000
}

Плюсы:

  • Стандарт де-факто для публичных API
  • Понятен любому разработчику
  • Хорошо кешируется (GET через CDN)
  • Документация через OpenAPI 3.x
  • HTTP-инфраструктура (proxy, load balancer, gateway) работает без настройки

Минусы:

  • Нет строгого контракта в самом стандарте (нужен OpenAPI отдельно)
  • Multi-resource запросы — N+1 (загрузить пользователя и его заказы — два HTTP-запроса)
  • Бинарные данные неудобны (base64 в JSON раздувает размер)
  • Streaming — костылями (chunked, SSE)

Когда выбирать: публичные API, мобильные/веб-клиенты, partner-API, когда нужна простота и кеширование.

SOAP

SOAP — XML-based RPC протокол. Сообщения в SOAP envelope, контракт описывается WSDL.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetUserRequest>
      <userId>123</userId>
    </GetUserRequest>
  </soap:Body>
</soap:Envelope>

Плюсы:

  • Жёсткий контракт через WSDL — клиент-серверная договорённость формальна
  • WS-Security — встроенная безопасность сообщений (подпись, шифрование на уровне сообщения, не только канала)
  • WS-ReliableMessaging — гарантии доставки на уровне протокола
  • WS-AtomicTransaction — распределённые транзакции
  • Стандарт в банках, госуслугах, страховых, enterprise-интеграциях

Минусы:

  • Многословный (XML envelope + headers)
  • Тяжёлый для мобильных/веб
  • Сложнее в отладке
  • Меньше инструментов для скетчинга/тестирования (есть SoapUI, Postman частично)

Когда выбирать: интеграция с банками, госуслугами (СМЭВ), страховыми, enterprise-системами, где WS-* стандарты обязательны или партнёр уже на SOAP.

В РФ SOAP ≠ legacy — это рабочий формат для большинства финтех/госовских интеграций.

gRPC

gRPC — Google RPC поверх HTTP/2 с Protocol Buffers (binary serialization).

service UserService {
  rpc GetUser (GetUserRequest) returns (User);
  rpc StreamOrders (StreamOrdersRequest) returns (stream Order);
}

message GetUserRequest {
  int64 user_id = 1;
}

Плюсы:

  • Бинарный протокол → компактный, быстрый
  • Strongly-typed контракт через proto-файлы
  • Codegen для 10+ языков (Go, Java, Python, C#, Node, ...)
  • HTTP/2 — мультиплексирование, server push, low-latency
  • Streaming в обе стороны (клиент → сервер, сервер → клиент, bidirectional)
  • Легко делать deadline/timeout, retry, load balancing на уровне клиента

Минусы:

  • Не для браузера напрямую (нужен gRPC-Web прокси)
  • Не кешируется через стандартные HTTP-CDN
  • Сложнее отлаживать (бинарь, не текст)
  • HTTP/2 нужно сквозь все прокси (старые балансировщики могут не уметь)

Когда выбирать: микросервис ↔ микросервис, low-latency RPC, потоки данных в реальном времени, polyglot-стеки. Не для публичного API мобилке/фронту.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

GraphQL

GraphQL — query language для API. Один endpoint /graphql, клиент сам описывает, какие поля и какие связанные сущности нужны.

query {
  user(id: 123) {
    name
    email
    orders(last: 10) {
      id
      amount
      items {
        name
        price
      }
    }
  }
}

Плюсы:

  • Клиент берёт ровно нужные поля → меньше over-fetching и under-fetching
  • Один запрос вместо N+1
  • Сильная типизация через SDL (Schema Definition Language)
  • Удобно для фронта, особенно сложных интерфейсов с разнородными данными

Минусы:

  • Сложнее кешировать (POST на один URL)
  • Сложнее rate limiting и cost analysis (один запрос может загрузить весь датасет)
  • Сложнее авторизация (на уровне поля, не URL)
  • Серверу сложнее: N+1 на бэкенде, нужны DataLoaders/batch
  • Не подходит для серверных интеграций («дай мне отчёт по контракту» удобнее на REST)

Когда выбирать: клиентский API мобильного/веб-приложения с множественными view, агрегатор API из нескольких бэкендов (BFF). Не выбирать для server-to-server интеграций между микросервисами.

Матрица выбора

Сценарий → выбор:

Сценарий Выбор Почему
Публичное API для партнёров/мобилок REST Стандарт, кешируется, прост
Интеграция с банком/госуслугами SOAP WS-Security, WSDL — обычно требование партнёра
Микросервис ↔ микросервис, low-latency gRPC Бинарь, HTTP/2, streaming, codegen
Сложный фронт с агрегацией данных GraphQL Гибкие запросы, нет N+1 для клиента
Уведомления в реальном времени браузеру WebSocket / SSE Push с сервера
Длительный батч (отчёт за месяц) REST + async (202 + status URL) Не блокировать соединение
Файловый обмен (1С → DWH) SFTP / S3 Большие объёмы, оффлайн

Правило для ТЗ: если партнёр уже определился — это решено, описываем под него. Если выбираем мы — обосновываем матрицей выше с явным trade-off.

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

REST на всё. «Микросервисы общаются по REST, потому что REST» — без оценки latency и нагрузки. На горячем пути 1000 RPS REST-JSON может стоить в разы дороже gRPC.

GraphQL для серверных интеграций. Микросервис A зовёт B через GraphQL — оверкилл. Контракт и так известен, гибкие запросы не нужны, добавляется сложность.

SOAP «в современном стеке не место». В банке/госе SOAP — стандарт. Аналитик, который не умеет описывать SOAP-интеграцию, не пройдёт собес в финтех.

gRPC между фронтом и бэкендом без gRPC-Web. Браузер не умеет нативный gRPC. Нужен прокси Envoy/Nginx с gRPC-Web.

Игнорировать кеширование. REST GET кешируется через CDN бесплатно — это огромный плюс на статичных endpoints. GraphQL/POST такой возможности из коробки не даёт.

Не описывать в ТЗ retry и таймауты. Любой протокол, если не описать поведение при сетевых сбоях, превратится в продакшен-инцидент.

Выбор «из тренда». GraphQL стал популярным → выбираем GraphQL для всего. Через год команда переписывает половину API обратно на REST.

Связанные темы

FAQ

REST это протокол или архитектурный стиль?

Архитектурный стиль (Roy Fielding, 2000). Протокол — HTTP. Когда говорят «REST API» — имеют в виду HTTP-API, следующий REST-принципам (ресурсы, методы, stateless, cacheable).

Чем gRPC лучше REST на цифрах?

Бинарный protobuf на 30–60% компактнее JSON. HTTP/2 мультиплексирование избавляет от head-of-line blocking. На low-latency RPC между микросервисами разница в latency — 2–5× в пользу gRPC.

GraphQL заменяет REST?

Нет. GraphQL хорош для клиентских API с разнородными view. REST — для серверных интеграций, публичных партнёрских API, простых CRUD. На крупных продуктах часто сосуществуют: GraphQL BFF поверх REST-микросервисов.

SOAP в новых проектах писать?

Если требование партнёра/регулятора — да. Если выбор за нами — нет, REST/gRPC проще. Но переписать legacy SOAP на REST «потому что устарело» — обычно не стоит, риск/выгода плохие.

Что писать в ТЗ для выбора протокола?

Контекст (кто потребитель), тип нагрузки (запрос-ответ vs streaming vs батч), требования по latency, требования по безопасности (WS-Security?), кешируемость, ограничения партнёра. Затем — обоснование выбора.

Это официальная информация?

Нет. Статья основана на спецификациях REST/HTTP (RFC 9110), SOAP (W3C), gRPC (proto3), GraphQL (graphql-spec) и общей практике. Конкретные требования к интеграции зависят от партнёра и компании.


Тренируйте системный анализ — откройте тренажёр с 1500+ вопросами для собесов.