awesome-everything EN
↑ Обратно к восхождению

API

gRPC и Protobuf: построй контракт, переживающий эволюцию

Суть Практический проект — спроектируй gRPC-сервис, эволюционируй его схему через две несовместимые версии, не сломав живых пиров, добавь streaming RPC и докажи распространение deadline под сбоем.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 240 min

Читать про порчу field tag — не то же самое, что удержать живой контракт целым через деплой. Построй небольшой gRPC-сервис, затем эволюционируй его схему так, как тебя вынуждает реальная система — старые клиенты ещё в полёте, новые поля приземляются, удалённое поле, которое никогда не должно вернуться — и докажи запущенными пирами, что ничего не декодировалось в неверный слот.

Цель

Преврати ментальную модель юнита в рабочий контракт: определи proto, запусти две версии сервиса бок о бок, эволюционируй схему add-only с reserved, добавь streaming RPC по правильной причине и продемонстрируй, что deadlines распространяются и отменяют работу по графу вызовов.

Проект
0 из 7
Цель

Построй небольшой gRPC-сервис (Go или любой язык со зрелым gRPC-стеком), эволюционируй его схему Protobuf через две версии, которые должны взаимодействовать в обе стороны, добавь один streaming RPC и докажи — двумя запущенными пирами и захваченными доказательствами — что эволюция схемы остаётся безопасной и deadlines распространяются.

Требования
Критерии приёмки
  • Воспроизводимая матрица совместимости (команды + захваченный вывод), доказывающая взаимодействие v1-v2 в обе стороны с нулём недекодированных полей.
  • Захваченный вывод ветки намеренного слома, показывающий, что перенумерация/переиспользование портит значение, плюс откатанный main, где reserved блокирует переиспользование на этапе компиляции.
  • Streaming RPC работает против реального клиента, а обоснование в одно предложение называет, кто стримит, и почему более простая форма отвергнута.
  • Захваченный DEADLINE_EXCEEDED у клиента для вызова в медленный downstream, с доказательством, что deadline распространился, а не каждый хоп таймаутился независимо.
Senior-стретч
  • Добавь CI-гейт через buf breaking (или protolock), который диффит proto против закоммиченного baseline и валит сборку на любом wire-несовместимом изменении — перенумерация, смена типа или нерезервированное удаление.
  • Добавь grpc-web или Connect-путь для браузерного клиента и задокументируй, что именно добавляет слой прокси/трансляции и какие формы streaming он не поддерживает.
  • Добавь FieldMask (или optional-поля) для поддержки настоящей PATCH-семантики и покажи, как сервер отличает «очищено в пустое» от «не прислано» на скалярном поле.
  • Забенчмарь один и тот же payload как protobuf против JSON для насыщенного числами и насыщенного строками сообщения и отчитайся о дельте размера/задержки, чтобы подтвердить, где выигрыш wire format реален.
Итог

Это цикл, который ты прогоняешь всякий раз, когда gRPC-контракт должен меняться под живым трафиком: эволюционируй add-only, резервируй каждое удаление и проверяй двумя запущенными пирами, что обе стороны всё ещё декодируют корректно — затем докажи себе, один раз, что перенумерация действительно портит, чтобы дисциплина стала мышечной памятью. Выбирай формы streaming по тому, кто реально стримит, ставь deadlines, которые распространяются и отменяют downstream-работу, и держи gRPC там, где ему место — между твоими сервисами, с REST/Connect на браузерной границе.

Продолжить восхождение ↑Почему GraphQL получает N+1
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.