Реализация универсального дистрибьютора с использованием расширений protobuf в Netty - PullRequest
1 голос
/ 15 ноября 2011

Я бы хотел использовать Netty и Protobuf для реализации распространителя сообщений.Распространителем будет сервер, который знает о базовом сообщении protobuf и что у него есть расширения, и передает их другим классам, которые регистрируются для этих расширений.

Protobuf позволяет объявлять расширения в отдельных файлах, поэтому распространителю не нужно знать о формате расширений.Однако, похоже, что для работы с каналом Netty мне нужно создать ProtobufDecoder с ExtensionRegistry, который знает обо всех расширениях, иначе я столкнусь с проблемой, описанной здесь .

Я что-то здесь упускаю, или это то, что я не могу сделать, не написав свой собственный декодер?Если в Java есть пример, это было бы очень полезно.

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Вы можете указать ExtensionRegistry при создании ProtobufDecoder, как описано в документации API .

0 голосов
/ 20 января 2012

Мои два цента в том, что вы не используете расширения, если у них есть списки элементов или что-либо, что может потенциально привести к значительным сообщениям.Вы должны использовать один из декодеров / кодировщиков с кадрированием длины с сообщениями protobuf, чтобы они были правильно разделены по размеру.Если вы хотите, чтобы сообщения помещались, скажем, в 64 Кбайт с вашим 2-байтовым заголовком, неэффективно продолжать вызывать toByteArray в вашем сообщении, чтобы увидеть, будет ли оно вписываться в кадр.

Альтернативой является использованиеПеречислите главное сообщение, а не расширение, используйте байтовый массив, который является сериализованным сообщением protobuf, которое было бы в расширении.Таким образом, вы можете сохранять постфиксные данные в сообщении при его создании, а если вы превысите ограничение размера, вы можете аккуратно разделить его пополам, вместо того, чтобы Netty выдавала исключение, что оно слишком велико для фрейма.

...