Siv*_*gam 2 protocol-buffers proto grpc
在 gRPC protobuff 中寻找解决方案来为多租户应用程序实现不同数据类型的动态字段。
也可以有任意数量的基于租户的动态字段。
在 proto 中使用 map,我可以为每种数据类型定义不同的 map 集。有没有什么优化的方法来实现这一点。
对此的任何帮助表示赞赏。
Eri*_*son 10
在 protobuf 中有几种不同的传输动态内容的方法。哪种理想取决于您的用例。选项按其动态排序。较少动态的选项通常具有更好的性能。
使用google.protobuf.Any在proto3。这在您想要存储任意 protobuf 消息时很有用,并且通常用于提供扩展点。它取代了 proto2 的扩展。Any有一个子消息及其类型,因此您的应用程序可以在运行时检查它是否理解该类型。如果您的应用程序不知道类型,那么它可以复制 Any 但无法解码其内容。Any不能直接保存标量类型(如 int32),但每个标量都有一个可以替代的包装器消息。因为每个都Any包含消息类型作为字符串,所以如果您需要大量内容很小的消息,它就不适合了。
使用JSON 映射消息google.protobuf.Value。当您想要存储任意无模式 JSON 数据时,这很有用。因为它不需要存储其内容的完整类型,所以Value持有 a ListValueof number_values(doubles) 将比repeated Any. 但是,如果模式可用,则Any包含消息的repeated double将比 在线更紧凑Value。
使用包含每个允许类型的 oneof。通常需要一个新的消息类型来保存 oneof。当您可以限制模式但值具有关系时,这很有用,例如如果列表中每个值的位置很重要并且列表中的类型混合。这类似于Value但允许您选择自己的类型。虽然在技术上比Value通常用于生成更受约束的数据结构更强大。它等于或比 在线上更紧凑Value。这需要提前了解所需的类型。示例:map<string, MyValue>,其中MyValue:
message MyValue {
oneof kind {
int32 int_value = 1;
string string_value = 2;
}
}
Run Code Online (Sandbox Code Playgroud)
为每种类型使用单独的字段/集合。对于每种类型,您可以在 protobuf 消息中有一个单独的字段。这是您正在考虑的方法。这是最紧凑的在线和最高效的内存。您必须提前知道您有兴趣存储的类型。例子:map<string, int32> int_values = 1; map<string, string> string_values = 2。