当前位置: 首页 > 知识库问答 >
问题:

GRPC和协议-当另一方不同步释放时如何处理新字段

鲜于煜祺
2023-03-14

我有一种情况,grpc通信的另一端与他们的版本不同步。我的上级希望我因此添加一个字段,如果另一方填写或不填写它,该字段将在短时间内(如两周)起作用

我相信我可以通过将其添加到原始消息的末尾来做到这一点,这样其他字段的索引就不会改变。从我谷歌搜索的结果来看,可选字段在3.15版之前不可用,所以我必须使用一个工作。

向我介绍的解决方法是使用其中一种。然而,我不能百分之百确定那是什么样子。所有的例子都显示了字段本身。属于其中一个值的索引是否独立于属于消息其余部分的索引?

message TestMessage {  
    string somefield = 1;
    int someotherfield = 2;
    oneof mynewoptionalfield
    {
        string mynewfield = ???? Does this have to be 3 or is it 1?
        int ifihadanother = ???? Does this need to be 4 or 2?
    } 
}

问题:

  • 我使用的索引是什么???标记在
  • 当另一方不打算重新编译和部署原型文件时,这是正确的工作吗?
  • 然后如何检查该字段是否已填写在我的C代码中?

共有1个答案

仲璞瑜
2023-03-14

你的用例正是protobufs设计用来处理的。您所需要做的就是:在消息中添加一个新字段。在最简单的情况下,客户端应用程序代码在服务器推出完成之前不会查看新字段,因此不会注意到它有时存在,有时丢失。

您不应该更改现有字段的索引(字段ID),这是正确的。尽管我会注意到,您可以在消息中的任何位置添加新字段;字段的写入顺序对于protobuf并不重要。

所以您只需添加另一个字段,例如:

message TestMessage {  
    string somefield = 1;
    int someotherfield = 2;
    string mynewfield = 3;
}

您不必使用3作为id。您可以使用4、10或10000。但是对于protobuf来说,较小的数字更有效,通常只选择“下一个”id。在线路上,protobuf使用id来标识字段,因此以后不要更改id很重要。

在protobuf 3中,所有字段在protobuf 2意义上都是“可选的”;没有“必填”字段。然而,protobuf 2也为所有油田提供了“现场存在”。Protobuf 3仅为其中一个OF和消息提供现场存在。。。直到最近重新引入“可选”关键字。

在协议3中,如果您调用text Message.getMynewfield(),它将始终返回一个非空字符串。如果字符串未发送,它将使用空字符串(")。对于整数0返回,对于消息返回“默认消息”(所有默认值)。这对于许多用例来说已经足够了,并且可能对您来说已经足够了。

但是假设您需要区分"

message TestMessage {  
    string somefield = 1;
    int someotherfield = 2;
    google.protobuf.StringValue mynewfield = 3;
    // -or-
    optional string mynewfield = 3;
}

 类似资料:
  • 本文向大家介绍通知和协议的不同之处?相关面试题,主要包含被问及通知和协议的不同之处?时的应答技巧和注意事项,需要的朋友参考一下 答案:协议有控制链(has-a)的关系,通知没有。 首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和的行为模式,我们大致可以有自己的理解 简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。 按我们的理解,到不是直接说不能一对多,

  • 注册自定义协议并拦截现有协议请求 进程: 主进程​ 实现类似 file:// 协议的小例子 : 1 const {app, protocol} = require('electron') 2 const path = require('path') 3 app.on('ready', () => { 4 protocol.registerFileProtocol('atom', (request,

  • 我运行了一个模拟测试,以了解UDP通信面临的问题。 我有一个主机,其中有4个UDP客户机正在运行,每个客户机都有自己的线程(T1、T2、T3和T4)。T1和T2共享一个名为socket的DatagramSocket对象,而T3和T4共享一个名为socket2的DatagramSocket对象。 T1和T2正在发送和接收来自IP(例如)udpServer1的UDP服务器的回波,而T3和T4正在与ud

  • 本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范。产品规则采用的是ABNF 语法 大纲 以下是 gRPC 请求和应答消息流中一般的消息顺序: 请求 → 请求报头 *有定界符的消息 EOS 应答 → 应答报头 *有定界符的消息 EOS 应答 → (应答报头 *有定界符的消息 跟踪信息) / 仅仅跟踪时 请求 请求 → 请求报头 *界定的消息 E

  • 我正在开发一个仅支持iPhone的iOS 8应用程序。我想只支持iPhone 4S的纵向模式设备。 我有一个图形设计,它采用全屏内容。我使用自动布局来处理视图,并使其适用于所有屏幕。但是,我使用一个小资产来管理从iPhone4S工作的设计。当我在iPhone6S/6看到它时,内容非常小,大量额外的空间被浪费了。 当设备分辨率变大时,我想增加字体大小、图像大小。这个应用程序中有很多屏幕。 例如,我在

  • java线程如何获取同步块中使用的监视器或同步方法中使用的监视器上的锁? 我在多个帖子中读到,在有偏见的锁定情况下,此信息使用CAS操作存储在对象标头中,在有竞争的情况下,使用等待设置队列/监视器队列,但最终仅在对象标头中标记锁定。如果是这种情况,那么锁是如何释放的?如何将对象标记为免费以供另一个线程获取锁?内部是否为此使用了等待和通知方法?如果是这种情况,那么为什么在同步块内使监视器为空不会引发