Открыть сервис

Protocol Buffers

Protocol Buffers (protobuf) — это язык описания данных и бинарный протокол сериализации структурированных данных, разработанный в компании Google. Protocol Buffers предназначен для замены текстовых форматов, таких как XML и JSON, в задачах обмена данными между сервисами, хранения конфигураций и сериализации объектов в распределённых системах. Основное преимущество — высокая скорость обработки и компактность результирующих данных.

История

Разработка Protocol Buffers началась в Google в 2001 году как внутренний проект для оптимизации обмена данными между серверами. К 2008 году система созрела настолько, что Google выпустил её в открытый доступ под лицензией BSD. Первая публичная версия (protobuf 2) была представлена в 2008 году и сразу привлекла внимание разработчиков благодаря скорости и простоте. В 2016 году вышла версия 3 (proto3), которая упростила синтаксис, добавила поддержку новых языков (например, Go, C#, Ruby) и устранила некоторые ограничения предыдущей версии. С тех пор Protocol Buffers активно развивается сообществом и используется в таких проектах, как gRPC, Apache Kafka, TensorFlow и многих других.

Архитектура и принцип работы

Protocol Buffers основан на двух ключевых компонентах: языке описания схемы (proto-файлы) и компиляторе protoc. Разработчик описывает структуру данных в файле с расширением .proto, используя простой синтаксис, напоминающий C-подобные языки. Затем компилятор protoc генерирует на основе этого описания исходный код на одном из поддерживаемых языков программирования. Сгенерированный код содержит классы для сериализации и десериализации данных в бинарный формат.

Синтаксис proto-файлов

Пример простого proto-файла для версии proto3:

```protobuf syntax = "proto3";

message Person { string name = 1; int32 age = 2; repeated string phone_numbers = 3; } ```

Ключевые элементы:

Процесс компиляции

Компилятор protoc читает .proto-файл и генерирует код на целевом языке. Например, для Python он создаёт файлы с расширением _pb2.py, для C++.pb.h и .pb.cc, для Java — .java. Сгенерированные классы содержат методы:

Преимущества и недостатки

Преимущества

Недостатки

Применение

Protocol Buffers широко используется в высоконагруженных распределённых системах, где важна производительность и экономия трафика. Основные области применения:

Версии и эволюция

Proto2 (2008)

Первая публичная версия. Поддерживала обязательные поля (required), необязательные (optional) и повторяющиеся (repeated). Имела строгие правила валидации.

Proto3 (2016)

Основные изменения:

Сравнение с альтернативами

ХарактеристикаProtocol BuffersJSONXMLApache AvroFlatBuffers
ФорматБинарныйТекстовыйТекстовыйБинарныйБинарный
Размер данныхОчень малыйСреднийБольшойМалыйМинимальный
Скорость сериализацииВысокаяСредняяНизкаяВысокаяОчень высокая
ЧитаемостьНетДаДаНетНет
Строгая типизацияДаНетЧастичноДаДа
Необходимость схемыДаНетДа (DTD/XSD)ДаДа
Поддержка языковМногоВсеВсеМногоМного
Обратная совместимостьХорошаяПлохаяХорошаяХорошаяХорошая

Инструменты и экосистема

Для работы с Protocol Buffers существует ряд инструментов:

Примеры использования

В gRPC

В gRPC сервисы описываются в proto-файлах с помощью ключевого слова service. Например:

``protobuf service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } ``

После компиляции генерируются клиентские и серверные заглушки, которые автоматически обрабатывают сериализацию и десериализацию.

В конфигурационных файлах

Protocol Buffers используется для хранения конфигураций в бинарном виде, что ускоряет загрузку и уменьшает размер файлов. Например, в проекте TensorFlow модели сохраняются в формате .pb (protobuf).

В мобильных приложениях

В Android-приложениях protobuf применяется для сериализации данных в кэше или при передаче по сети, что экономит трафик и ускоряет работу.

Критика и ограничения

Основные критические замечания:

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →