Лучший способ моделировать сообщения gRP C - PullRequest
1 голос
/ 25 мая 2020

Я хотел бы моделировать сообщения для двунаправленной потоковой передачи. В обоих направлениях я могу ожидать разные типы сообщений, и я не уверен, что было бы лучше. Две идеи на данный момент:

message MyMessage {
    MessageType type = 1;
    string payload = 2;
}

В этом случае у меня будет перечисление, которое определяет, какой тип сообщения и полезная нагрузка JSON, которая будет сериализована и десериализована в модели как клиент, так и сервер. сторона. Второй подход:

 message MyMessage {
    oneof type {
        A typeA = 1;
        B typeB = 2;
        C typeC = 3;
    }
}

Во втором примере oneof определяется так, что может быть установлен только один из типов сообщений. С обеих сторон на каждом из корпусов должен быть сделан переключатель (A, B, C или Нет).

1 Ответ

1 голос
/ 27 мая 2020

Если вы заранее знаете все возможные типы, использование oneof будет путем к go здесь, как вы описали.

Основной причиной использования буферов протокола является определение схемы . С помощью определения схемы вы получаете типы, генерацию кода, безопасное развитие схемы, эффективное кодирование и т. Д. c. С подходом oneof вы получите эти преимущества для вложенной полезной нагрузки.

Я бы не рекомендовал использовать string payload, поскольку использование строки для фактической полезной нагрузки лишает многих преимуществ использования буферов протокола. Кроме того, даже если вам не нужен оператор switch для десериализации полезной нагрузки, вам, вероятно, в какой-то момент понадобится оператор switch, чтобы использовать данные (если вы просто не перенаправляете данные в какую-то другую систему).

Альтернативный вариант

Если вы заранее не знаете возможные типы, вы можете использовать тип Any для вставки произвольного сообщения буфера протокола в ваше сообщение.

import "google/protobuf/any.proto";

message MyMessage {
  google.protobuf.Any payload = 1;
}

Сообщение Any - это в основном ваш подход string payload, но с использованием байтов вместо строки.

message Any {
  string type_url = 1;
  bytes value = 2;
}

Использование Any имеет следующие преимущества перед string payload:

  • Поощряет использование буфера протокола для определения динамики c содержимое полезной нагрузки
  • Инструменты в библиотеке буфера протокола для каждого языка для упаковки и распаковки сообщений буфера протокола в тип Any

Для получения дополнительной информации о Any см .:

...