Protobuf, как использовать любой тип с прото-сообщением homebrew

В настоящее время я создаю сервер gRPC python, который сериализует тонны различных протокольных сообщений в json, чтобы сохранить их в базе данных no-sql. Я хотел бы упростить расширение этого сервера, чтобы мы могли добавлять новые типы без перезаписи сервера gRPC и повторного развертывания. В идеале мы хотели бы определить новое сообщение, поместить его в прото-файл и обновлять только клиента. Сначала сервер должен ожидать любой тип, но знает файл или папку .proto, где искать, когда дело доходит до сериализации / десериализации.

Я читал о типе Any и изучаю, могу ли я это сделать. По нему есть некоторая документация, но очень мало примеров для работы. Я не совсем понимаю, как сохранить / получить тип поля Any.

  • Во всей документации https используется в качестве протокола для типа поля Any (например, type.googleapis.com/google.protobuf.Duration). Это тоже значение по умолчанию. Как бы это выглядело, если бы я использовал локальную файловую систему? Как мне сохранить это в прото-сообщении на стороне клиента?
  • Как я могу получить тип на стороне сервера?
  • Где найти аналогичный пример?

person hasdrubal    schedule 03.08.2020    source источник


Ответы (1)


Извините, это лишь частичный ответ.

Недавно я начал использовать Any в своем проекте и могу рассказать о некоторых перспективах. У меня есть аналогичное (хотя и более простое) требование к тому, что вы изложили. Содержимое сообщения заключено в оболочку, но в моем случае клиенты должны отправить дескриптор на сервер и определить конкретный метод, чтобы помочь ему (де) маршалировать и т. Д.

Я использовал новый Golang APIv2 от Google и знаком с ним только по Golang и Rust (не Python). Документация отсутствует, но документы Golang, надеюсь, помогут:

Мне тоже было трудно понять концепцию (реализацию) глобального реестра, поэтому я взломал вышеуказанное решение. Метаданные входящего сообщения предоставляют серверу достаточный контекст, чтобы он мог сконструировать тип сообщения и упорядочить в него байты.

person DazWilkin    schedule 03.08.2020