Почему protobuf не может работать поверх HTTP/1.1

«Почему protobuf не может работать поверх HTTP/1.1» — вопрос из категории Сети, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Protobuf может работать поверх HTTP/1.1, но неэффективно. Основные проблемы:

  1. Отсутствие мультиплексирования - HTTP/1.1 требует последовательной обработки запросов, что снижает производительность при потоковой передаче protobuf-сообщений.

  2. Нет бинарных фреймов - HTTP/1.1 текстовый, protobuf бинарный, требуется base64-кодирование, что увеличивает объем данных.

  3. Заголовки HTTP/1.1 добавляют значительные накладные расходы для небольших protobuf-сообщений.

Пример HTTP/1.1 с protobuf:

// Клиент
reqBody, _ := proto.Marshal(&pb.Request{Id: 1})
req, _ := http.NewRequest("POST", url, bytes.NewReader(reqBody))
req.Header.Set("Content-Type", "application/x-protobuf")
client.Do(req)

// Сервер
body, _ := io.ReadAll(r.Body)
var req pb.Request
proto.Unmarshal(body, &req)

Лучше использовать HTTP/2 или gRPC, где есть бинарные фреймы и мультиплексирование.