在Netty中使用protobuf扩展实现通用分发服务器

时间:2011-11-15 19:46:54

标签: netty

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

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

我在这里遗漏了什么,或者这是我在没有编写自己的解码器时无法做到的事情?如果Java中有一个例子,那将非常有用。

2 个答案:

答案 0 :(得分:1)

您可以在构建ExtensionRegistry时指定ProtobufDecoder,如the API documentation中所述。

答案 1 :(得分:0)

我的两分钱是你没有使用扩展名,如果他们有元素列表或任何可能导致大量消息的东西。您必须使用长度成帧解码器/编码器之一与protobuf消息,因此它们正确的大小分隔。如果您希望消息适合,例如,64k w / 2字节大小的标题,那么在消息上调用toByteArray以查看它是否适合该帧是没有效率的。

替代方法是在主消息上使用枚举,而不是扩展,使用字节数组,这是扩展名中的protobuf序列化消息。通过这种方式,您可以在构建时将后缀数据保留到消息中,如果超过大小限制,则可以将其优雅地分成两半,而不是让Netty抛出异常,因为它对于帧来说太大了。