Что такое protobuf и как он используется в gRPC
Что проверяют
Работали ли вы с типизированным контрактом между сервисами, а не только с JSON по договорённости. Для инженера данных важнее другое: понимаете ли, зачем схему выносят из кода наружу и что происходит с конвейером, когда схема меняется.
Как отвечать
Protocol Buffers это язык описания схемы плюс компактный бинарный формат. Вы пишете файл .proto, компилятор protoc порождает из него классы для Python, Go и Java, и обе стороны работают с одним описанием.
На проводе передаются номера полей и значения, имена полей не передаются вовсе. Отсюда и компактность, и главное правило совместимости: номер поля неизменен навсегда, номера удалённых полей уходят в reserved, новое поле получает новый номер, а старый читатель просто пропускает незнакомое.
syntax = "proto3";
message Prediction {
string request_id = 1;
repeated float features = 2;
optional double score = 3;
}gRPC берёт protobuf как способ описать сервис и сериализовать сообщения, а транспортом использует HTTP/2 с мультиплексированием и потоками. Отсюда четыре вида вызовов: унарный, серверный поток, клиентский поток, двунаправленный. Для сервинга модели унарный вызов подходит одиночному инференсу, а серверный поток отдаче предсказаний по мере готовности.
Честно назовите цену: сообщение не прочитать глазами в логах, нужны дисциплина версий и реестр схем.
Где спотыкаются
Переиспользуют номер удалённого поля или меняют номер существующего. Старые потребители не заметят ошибки и молча прочитают чужое значение, если совпал тип на проводе. Именно поэтому в схеме есть reserved, и именно поэтому исторические данные в очереди ломаются тихо.
Полагают, что поле обязательно, раз оно описано. В proto3 у скаляров есть значение по умолчанию, и без optional или обёртки отличить отсутствующее поле от нуля невозможно. Для признаков модели это разные вещи: пропуск и ноль дают разный прогноз.
Предлагают protobuf как формат хранения аналитики. Это транспорт и контракт обмена, для колоночного хранения и сканов нужны Parquet или ORC, а для витрин таблицы. Смешение ролей даёт озеро из бинарных блобов, которые нечем запросить.