Как динамически назначить правильное сообщение для декодирования протокола буфера сообщения? - PullRequest
0 голосов
/ 12 октября 2018

Привет! У меня есть конвейер потока данных, который работает над «событиями».Эти события являются простыми сообщениями буфера протокола, скажем:

message OrderCoffee {
    int32 id = 1;
}

message CancelOrder {
    int32 id = 1;
}

Затем клиент сериализует / кодирует эти сообщения и передает их в брокер сообщений (скажем, Google Pub/Sub).Абонент потребляет одно сообщение и пытается декодировать / десериализовать (псевдокод):

decoded_message = OrderCoffe.decode(encoded_message)
decoded_message = CancelOrder.decode(encoded_message)

Какая из этих строк работает?Оба, по крайней мере, в моем коде Ruby.Я не знаю, есть ли у меня концептуальное недоразумение о том, как использовать буферы протокола, или это ошибка в рубине.

Если это ожидаемое поведение, как я могу узнать во время выполнения, какое сообщение я должен декодировать полученное сообщение?

РЕДАКТИРОВАТЬ:

Хорошо, решение похоже на https://developers.google.com/protocol-buffers/docs/techniques?csw=1#self-description.

Я не мог понять, хотя.Может ли кто-нибудь привести пример того, как реализовать это в ruby?

1 Ответ

0 голосов
/ 13 октября 2018

По сути, вы не можете оттуда.Сообщения Protobuf не имеют самоописания.Если бы это был я, я бы добавил оболочку:

message SomeType {
    oneof the_thing {
        OrderCoffee order = 1;
        CancelOrder cancel = 2;
    }
}

Когда вы десериализуете the_thing, вы можете проверить, какой внутренний объект назначен.

...