较旧的服务传输较新版本的协议缓冲区3消息

时间:2016-07-13 18:16:31

标签: go protocol-buffers grpc

说,我有一个

形式的协议缓冲消息(在proto3中)
message A {
  int32 foo = 1;
}

我正在运行使用这些消息写入Go的服务器X,Y和Z,并使用gRPC传递它们,以便X与Y和Y对话与Z对话,即X和Z通过Y进行通话。

Alice设计了一个很酷的新功能,需要在消息A中添加一个新字段bar,并更新服务器X和Z.

message A {
  int32 foo = 1;
  int32 bar = 2;
}

但是,部署版本的服务器Y无法识别此新字段,重新部署服务器Y以实现此目标在大型系统中很快就会变得非常困难。

在之前的生活中,我们使用了proto2,所有这一切都运行良好,因为它会保留未被识别的字段。但是,Google现在建议我们将proto3与gRPC一起使用,根据我的理解,至少在Go中不再支持保留无法识别的字段。

使用proto3解决此问题的推荐方法是什么?

更新
关于这个问题有一个开放的github问题 https://github.com/google/protobuf/issues/272

1 个答案:

答案 0 :(得分:0)

您可以为将来的扩展需求添加任意字段:

https://developers.google.com/protocol-buffers/docs/proto3#any

我自己没有使用它,但如果我理解正确,甚至无法识别任何字段值应该在消息被解码和重新编码时保留。