Что такое Protocol Buffers и как они используются
Что проверяют
Понимаете ли вы, зачем нужен бинарный формат со схемой, и держите ли в голове совместимость версий. Для Java-разработчика вопрос почти всегда ведёт к gRPC и к обмену между сервисами, где схема меняется, а старые клиенты остаются в строю.
Как отвечать
Protocol Buffers это язык описания схемы и бинарный формат сериализации. Структуру описывают в файле с расширением proto, компилятор генерирует классы для нужного языка, в Java это неизменяемые объекты с билдером.
syntax = "proto3";
message Person {
string name = 1;
int32 id = 2;
optional string email = 3;
}Person p = Person.newBuilder().setName("Ann").setId(7).build();
byte[] bytes = p.toByteArray();
Person back = Person.parseFrom(bytes);Почему выбирают: компактнее и быстрее текстовых форматов, схема задаёт контракт явно, генерация избавляет от ручного разбора, а поверх схемы строится gRPC со строгими сигнатурами методов и потоками.
Главное в ответе это правила совместимости. По сети едут номера полей, а не имена: переименование безопасно, смена номера или типа ломает читателей. Освободившиеся номера закрывают через reserved, чтобы их не переиспользовали. Добавление поля совместимо в обе стороны, неизвестные поля сохраняются при обратной сериализации.
Назовите и минус: формат не самоописывающий, без схемы байты не прочитать, разбор инцидентов по логам сложнее, чем с JSON.
Где спотыкаются
Пишут несколько сообщений подряд в один поток и пытаются прочитать их по очереди. Сообщение не несёт своей длины, при разборе они сольются в одно; для потока есть запись и чтение с префиксом длины.
Путают отсутствие значения и значение по умолчанию. В proto3 нулевые значения по сети не передаются, и без ключевого слова optional или обёрточного типа не отличить ноль от незаполненного поля, а логика, опирающаяся на такое различие, ошибается молча.
Переназначают номера полей при рефакторинге или переиспользуют освободившиеся. Новый сервис прочитает старые данные как свои, типы совпадут по разрядности, и ошибка проявится не на сборке, а на боевых сообщениях предыдущей версии.