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

在Netty中使用protobuf扩展实现通用分发服务器,netty,Netty,我想使用Netty和Protobuf实现一个消息分发器。分发服务器将是一个服务器,它知道基本protobuf消息,并且它有扩展,并将它们传递给注册这些扩展的其他类 Protobuf允许在单独的文件中声明扩展名,因此分发服务器不需要知道扩展名的格式。然而,对于Netty管道来说,这似乎是可行的,我需要使用ExtensionRegistry创建ProtobufDecoder,该ExtensionRegistry知道所有扩展,否则我将遇到所描述的问题 我是否遗漏了一些东西,或者这是我必须自己编写解码器

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

Protobuf允许在单独的文件中声明扩展名,因此分发服务器不需要知道扩展名的格式。然而,对于Netty管道来说,这似乎是可行的,我需要使用ExtensionRegistry创建ProtobufDecoder,该ExtensionRegistry知道所有扩展,否则我将遇到所描述的问题


我是否遗漏了一些东西,或者这是我必须自己编写解码器才能做到的?如果Java中有一个示例,那将非常有用。

您可以在构建
ProtobufDecoder
时指定
扩展注册表,如中所述。

您可以在构建
ProtobufDecoder
时指定
扩展注册表,如中所述。

我的两分钱是,如果扩展包含元素列表或任何可能导致大量消息的内容,则不使用扩展。您必须在protobuf消息中使用一个长度帧解码器/编码器,以便它们的大小被正确分隔。如果您想让消息适合,比如说,64k w/您的2字节大小的报头,那么在消息上不断调用toByteArray以查看它是否适合帧是低效的


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

我的两分钱是,如果扩展包含元素列表或任何可能导致大量消息的内容,则不使用扩展。您必须在protobuf消息中使用一个长度帧解码器/编码器,以便它们的大小被正确分隔。如果您想让消息适合,比如说,64k w/您的2字节大小的报头,那么在消息上不断调用toByteArray以查看它是否适合帧是低效的


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

谢谢,信任-我已经知道这一点,但我感到困惑的是,我不想让分发服务器知道所有的扩展,因此我给ProtobufDecoder的扩展注册表将几乎是空的。我认为这没关系-我可以重新序列化消息并将其传递给处理程序,该处理程序使用知道相关扩展的ExtensionRegistry进行自己的解码。对吗?不幸的是,我没有机会使用protobuf扩展,所以我不确定它是否正确。不过我想,这应该行得通。请回到这里,让我们知道它是否有效。谢谢,信任-我已经知道了,但我感到困惑的是,我不想让分发服务器知道所有的扩展,因此我给ProtobufDecoder的扩展注册表将几乎是空的。我认为这没关系-我可以重新序列化消息并将其传递给处理程序,该处理程序使用知道相关扩展的ExtensionRegistry进行自己的解码。对吗?不幸的是,我没有机会使用protobuf扩展,所以我不确定它是否正确。不过我想,这应该行得通。请回到这里,让我们知道它是否有效。