Эта глава темы 9 фокусируется на выборе API-стиля под latency, эволюцию схемы и DX.
В реальном проектировании систем материал помогает принимать решения через измеримые ограничения: latency budget, blast radius, устойчивость контрактов и стоимость эксплуатации интеграции.
Для system design interview глава дает структурный язык объяснения: почему выбран подход, какие альтернативы рассматривались и какие operational риски надо фиксировать заранее.
Практическая польза главы
Практика проектирования
Подбирайте API стиль по профилю клиентов: mobile, backend-to-backend или federated UI.
Качество решений
Оценивайте контракт по latency, payload efficiency, schema evolution и governance effort.
Interview articulation
Показывайте decision matrix вместо догматичного выбора «один стиль на всё».
Failure framing
Учитывайте риски over-fetch/under-fetch, сложность observability и lock-in инструментария.
Источник
gRPC Introduction
Официальный гайд по модели gRPC и сервисным контрактам.
На практике команды редко выбирают один «универсальный» API-подход. Обычно вопрос звучит иначе: где нужен стабильный внешний контракт, где критичен low-latency RPC, а где важна гибкость клиентской выборки данных. Эта глава даёт сравнение REST, gRPC и GraphQLчерез архитектурные trade-offs, а не через технологический хайп.
Сравнение по ключевым критериям
| Критерий | REST | gRPC | GraphQL |
|---|---|---|---|
| Модель контракта | HTTP-ресурсы + OpenAPI как внешний контракт. | IDL-контракт (`.proto`) с генерацией серверов и клиентов. | Единая граф-схема + запросы клиента к нужному подмножеству данных. |
| Payload и сериализация | Обычно JSON: читаемо, но тяжелее по размеру. | Protobuf: компактнее и дешевле по CPU/network. | Чаще JSON; размер зависит от формы query и политики кэша. |
| Latency/throughput профиль | Хороший baseline для публичных API и интеграций. | Часто лучше p95 latency на внутренних RPC-path. | Выигрывает в гибкости клиента, но может терять на resolver fan-out. |
| Эволюция API | Versioning через URI/header + backward compatibility policy. | Эволюция полей по правилам protobuf (`reserved`, номера полей). | Schema evolution через deprecation и typed contract. |
| Кэширование | Сильные встроенные механики HTTP cache/control. | Обычно кэш строится на уровне клиента/gateway/application. | Требует отдельной стратегии: persisted queries, normalized cache, DataLoader. |
| Лучший контекст применения | Публичные API, партнерские интеграции, широкий ecosystem tooling. | Внутренние межсервисные вызовы, streaming и low-latency контуры. | BFF/gateway для сложных UI и нескольких клиентских платформ. |
Как выбирать в реальных сценариях
Сценарий
Публичное API для внешних партнеров
Чаще выбирают
REST
Проще onboarding, предсказуемый HTTP-контракт, сильная совместимость по tooling.
Сценарий
Внутренний сервисный mesh с жёстким latency budget
Чаще выбирают
gRPC
Бинарная сериализация и строгий IDL дают более стабильную производительность и контрактную дисциплину.
Сценарий
Мобильный и web-клиент с разными потребностями в данных
Чаще выбирают
GraphQL
Клиент сам формирует выборку и снижает over-fetching/under-fetching на UI слое.
Сценарий
Смешанный enterprise-ландшафт
Чаще выбирают
Комбинация
Частый вариант: REST наружу, gRPC между сервисами, GraphQL как клиентский фасад/BFF.
Частые антипаттерны
Рекомендации
References
- Roy Fielding: REST dissertation - первоисточник ограничений REST и архитектурного стиля.
- gRPC Documentation - официальное введение в сервисы, контракты и типы RPC-вызовов.
- GraphQL Learn - официальный материал по схеме, query/mutation и практикам производительности.
- OpenAPI Specification - каноничный стандарт описания REST-контрактов и схем данных.
Связанные главы
- API: RPC и REST - базовый контекст удалённых вызовов и их сетевых trade-offs.
- Паттерны межсервисной коммуникации - расширяет выбор протокола до sync/async-потоков, retries и backpressure.
- Customer-friendly API: удобное API для клиентов - практика BFF vs GraphQL и клиент-ориентированного API-дизайна.
- API Design Patterns (short summary) - системный подход к эволюции контрактов и управлению breaking changes.
- Learning GraphQL (short summary) - углубление в схему, резолверы и прикладной GraphQL workflow.
- Service Discovery - инфраструктурная база для устойчивых межсервисных вызовов в runtime.
