【问题标题】:Is google.protobuf.Empty dangerous for backwards compatibility?google.protobuf.Empty 对向后兼容有危险吗?
【发布时间】:2018-12-02 06:41:04
【问题描述】:

specgoogle.protobuf.Empty 声明:

您可以重复使用的通用空消息以避免定义重复 API 中的空消息。一个典型的例子是使用它作为请求 或 API 方法的响应类型。

我一直在内部提倡使用空消息包装器,以保持向后兼容性。例如,假设我们有一个FooService

service Foo {
    rpc List(google.protobuf.Empty) returns (ListResponse) {}
}

message ListResponse {
    repeated Foo results = 1;
}

message Foo {...}

如果将来我们需要向这个列表请求添加分页,我们需要引入一个请求包装器:

message ListRequest {
    int limit = 1;
    int offset = 2;
}

然后更新rpc签名:

rpc List(ListRequest) returns (ListResponse) {}

这是一个向后不兼容的变化,还是 protobuf 格式可以优雅地处理这个?

【问题讨论】:

    标签: protocol-buffers grpc


    【解决方案1】:

    有线格式可以优雅地处理这个问题。但是,大多数使用 gRPC 存根的代码都会中断,因为类型安全语言会注意到不兼容的类型。

    如果您认为您可能曾经需要字段,请继续为这种情况制作一条特殊消息,即使它是空的。如果有疑问,就去做。如果您确信您将永远需要任何字段(“删除”的响应消息是一个常见示例),那么使用Empty 就可以了。

    我在Modifying gRPC Services Over Time 谈话中提到了这个具体案例。提供幻灯片和视频录制。

    【讨论】:

    • 所以这只是源代码兼容性问题,对现有客户端来说不是问题。谢谢!
    猜你喜欢
    • 2011-04-28
    • 2011-12-31
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2011-03-02
    • 2012-01-29
    • 2010-09-16
    相关资源
    最近更新 更多