【问题标题】:grpc and protobuf - How to handle a new field when the other side is not releasing in syncgrpc 和 protobuf - 当对方未同步释放时如何处理新字段
【发布时间】:2021-04-30 18:16:32
【问题描述】:

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

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

向我描述的解决方法是使用oneof。但是,我不是 100% 确定那是什么样子。所有示例都单独显示了 oneof 字段。属于 oneof 值的索引是否与属于消息其余部分的索引缩进?

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?
    } 
}

问题:

  • 我使用的索引是什么?标记是
  • 当另一方不打算重新编译和部署对 protofile 的更改时,这是否是正确的解决方法?
  • 然后如何检查该字段是否填写在我的 C++ 代码中?

【问题讨论】:

    标签: protocol-buffers grpc


    【解决方案1】:

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

    您是正确的,您不应该更改预先存在的字段的索引(字段 ID)。虽然我会注意到您可以在消息中添加新字段anywhere;字段的写入顺序对于 protobuf 无关紧要。

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

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

    您没有使用 3 作为 id。您可以使用 4、10 或 10000。但是对于 protobuf,小数字更有效,通常只选择“下一个”id。 On-the-wire protobuf 使用 id 来标识字段,因此以后不要更改 id 很重要。

    在 protobuf 3 中,所有字段在 protobuf 2 意义上都是“可选的”;没有“必填”字段。但是,protobuf 2 还为所有字段提供了“字段存在”。 Protobuf 3 只为 oneofs 和消息提供字段存在......直到最近重新引入“可选”关键字。

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

    但是假设您需要区分""<notsent>。这就是现场存在所提供的。 protobuf 3 中的 Messages 具有“has”方法,如果存在值,则返回 true。但是原语没有那种存在信息。一种选择是用standard wrappers 将原语“装箱”,使原语成为一条消息。在较新版本的 protobuf 中可用的另一个选项是 optional 关键字。这两个选项都将提供类似textMessage.hasMynewfield() 的方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-29
      • 2013-06-11
      • 2021-03-29
      • 2018-08-20
      • 2012-12-09
      • 2020-03-29
      • 2015-07-19
      • 2013-07-03
      相关资源
      最近更新 更多