Как динамически назначать правильное сообщение для декодирования сообщения буфера протокола?

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

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 .

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


person Montenegrodr    schedule 12.10.2018    source источник


Ответы (1)


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

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

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

person Marc Gravell    schedule 12.10.2018