1

我想使用 Netty 和 Protobuf 来实现消息分发器。分发器将是一个服务器,它知道基本 protobuf 消息并知道它具有扩展,并将它们传递给注册这些扩展的其他类。

Protobuf 允许在单独的文件中声明扩展,因此分发者不需要知道扩展的格式。然而,这似乎与 Netty 管道一起工作,我需要使用知道所有扩展的 ExtensionRegistry 创建 ProtobufDecoder,否则我会遇到这里描述的问题。

我在这里遗漏了什么,还是如果不编写自己的解码器就无法做到这一点?如果有 Java 中的示例,那将非常有帮助。

4

2 回答 2

1

ExtensionRegistry您可以在构造 a 时指定a ProtobufDecoder,如API 文档中所述

于 2011-11-15T23:49:10.933 回答
0

我的两分钱是,如果它们具有元素列表或任何可能导致大量消息的扩展,则不要使用扩展。您必须将长度帧解码器/编码器之一与 protobuf 消息一起使用,以便它们的大小正确分隔。如果您希望消息适合,例如,带有 2 字节大小的标头的 64k,那么在您的消息上继续调用 toByteArray 以查看它是否适合框架是低效的。

另一种方法是在主消息上使用枚举,而不是扩展,使用字节数组,它是扩展中的 protobuf 序列化消息。这样,您可以在构建消息时保留对消息的后缀,如果超出大小限制,您可以优雅地将其分成两半,而不是让 Netty 抛出一个异常,认为它对于框架来说太大了。

于 2012-01-20T13:52:35.260 回答