API
gRPC и Protobuf: тест с множественным выбором
Шесть вопросов поперёк всего юнита. Каждый отражает реальное решение — изменение схемы, которое ты подписываешь, форму streaming для выбора, deadline для установки — а не определение для заучивания. На проводе едут номера, а не имена, и большинство этих ловушек рождается из того, что про это забыли.
Убедись, что связываешь wire format Protobuf, дисциплину field tag, четыре формы вызовов, deadlines и границу gRPC-против-REST — синтез, к которому вёл урок.
Коллега переименовывает поле Protobuf с discount_pct на discountPercent и тем же коммитом перенумеровывает его с 3 на 4, чтобы номера шли подряд. Какое изменение безопасно, а какое портит данные?
Нужно удалить устаревшее поле с номером 3 из сообщения, живущего в production. Каков senior-ход?
Новая сборка producer'а добавляет поле 7 и шлёт его consumer'ам, всё ещё на старой схеме; тем временем старый producer вовсе опускает поле 7, общаясь с новыми consumer'ами. Что происходит в каждом направлении?
Дашборду нужно, чтобы сервер пушил живые обновления цены каждому клиенту, пока тот подписан, без запроса на каждое обновление. Какая форма RPC подходит и какова частая ошибка?
Клиентский вызов возвращает DEADLINE_EXCEEDED, но логи сервера показывают, что обработчик завершился и закоммитил запись. Как это читать и каков надёжный фикс?
Публичный REST-эндпоинт, дёргаемый напрямую из React SPA, тормозит под нагрузкой. Коллега предлагает перевести его на нативный gRPC, чтобы браузер звал его напрямую. Каков senior-ход?
Сквозная линия юнита — один факт: провод несёт field tag и значения, никогда имена. Поэтому переименование бесплатно, а перенумерация или переиспользование номера — молчаливая порча; add-only эволюция с reserved — единственный безопасный путь, и именно она даёт Protobuf двустороннюю backward/forward совместимость. Поверх мультиплексирования HTTP/2 четыре формы вызовов отражают, кто стримит (unary, server, client, bidi), deadlines распространяются и могут провалить caller’а, чья работа реально удалась, а решение на границе остаётся прежним: gRPC между твоими сервисами, REST/JSON или Connect-RPC у браузера.