【问题标题】:What is the common way to detect a client/server version mismatch检测客户端/服务器版本不匹配的常用方法是什么
【发布时间】:2017-09-13 13:36:43
【问题描述】:

我们正在实现一个客户端/服务器应用程序来在远程系统上运行我们的硬件。

为此,我们使用 GRPC、protobuf v3。

当我们修改.proto文件并重新编译客户端而不更新服务器时,我们得到了一个带有模糊消息的异常:

异常被处理程序抛出。

使用 GRPC,检测客户端/服务器版本不匹配的常用方法是什么?

编辑:修改示例

例如我们改变这个(消息参数的特定类型):

service RpcAcquisitionCard {
    ...
    rpc SetNumericalControlOscillator(RpcNcoConfiguration)
    ...
}

message RpcNco {
    RpcDeviceIdentifier deviceId = 1;
    core.protobuf.RpcFrequency nco1 = 2;
    core.protobuf.RpcFrequency nco2 = 3;
}

至此(消息参数的通用类型)

service RpcAcquisitionCard {
    ...
    rpc SetNumericalControlOscillator(RpcCommandParameter)
    ...
}

message RpcCommandParameter {
    RpcDeviceIdentifier deviceId = 1;
    google.protobuf.Any parameter = 2;
}

message RpcNco {
    core.protobuf.RpcFrequency nco1 = 1;
    core.protobuf.RpcFrequency nco2 = 2;
}

RpcCommandParameter.parameter 字段是RpcNco

【问题讨论】:

  • protobuf 向后向前兼容。您如何更改 proto 以使其不再兼容?
  • 我添加了修改示例。
  • Protobuf v3.我们正处于开发的早期阶段。

标签: c# client-server protocol-buffers grpc


【解决方案1】:

使用protobuf时建议阅读Language Guide

https://developers.google.com/protocol-buffers/docs/proto3#updating 与您的场景特别相关:

字段可以被删除,只要标签号不再使用 您更新的消息类型。您可能想要重命名该字段, 也许添加前缀“OBSOLETE_”,或者保留标签,所以 您的 .proto 的未来用户不会意外重复使用该号码。

那是你做错了。而不是改变:

message RpcNco {
    RpcDeviceIdentifier deviceId = 1;
    core.protobuf.RpcFrequency nco1 = 2;
    core.protobuf.RpcFrequency nco2 = 3;
}

到:

message RpcNco {
    core.protobuf.RpcFrequency nco1 = 1;
    core.protobuf.RpcFrequency nco2 = 2;
}

你应该把它改成:

message RpcNco {
    RpcDeviceIdentifier OBSOLETE_deviceId = 1;
    core.protobuf.RpcFrequency nco1 = 2;
    core.protobuf.RpcFrequency nco2 = 3;
}

然后,您的客户端和服务器将能够相互通信,无论它们具有旧的 protobuf 定义还是新的定义。

【讨论】:

  • 感谢您的回复,我们正处于开发的早期阶段,.proto 文件移动了很多。我们不想标记永远不会投入生产的过时消息。我的问题更多是关于检测与显式消息的不匹配而不是避免它们。
  • 我想我是在挑战你的方向。 Protobuf 具有解决此问题的内置机制。你现在的痛苦是特别是,因为你没有遵循标准。 如果您去看医生并说因为头一直撞到墙上而感到疼痛,那么医生不会告诉您如何以更温和的方式撞墙或给您止痛药。他/她会建议你不要再用头撞墙了。
  • 实际上我们开始学习如何使用 GRPC 行走,是的,我们多次碰壁。好的,从长远来看,GRPC 管理版本控制问题很酷(如果我们遵循指南,这会给 API 用户带来很多责任)。但是我仍然对在客户端/服务器不匹配的情况下提供的消息感到惊讶,这是无助的。我希望有一条明确的异常消息,其中包含有关已发送消息的信息以及有关服务器未对其进行管理的某些信息。不管怎样,我的大学一直卡在这3天,因为他没有正确更新服务器端。他很难学会这一点。
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多