【问题标题】:Using google protobuffer for delta messages使用 google protobuf 处理增量消息
【发布时间】:2017-08-14 09:10:19
【问题描述】:

我正在研究使用 Google Protobuffers 进行增量消息传递。这意味着我只想发送我的域对象的更改值。

但这暴露了用于此目的的协议问题。我可以轻松地忽略未更改的属性,这将为我们提供简洁的信息。

但是那些将值从_something_ 更改为null 的属性呢?在协议缓冲区中无法区分这两种情况。

其他人在这里做了什么?我正在研究几种不同的解决方案:

  1. 为所有对象添加一个元属性,即一个int数组。如果任何属性应更改为 null,请在此数组中包含字段编号。如果没有属性更改,则元属性将被忽略,并且不会占用消息中的带宽。

  2. 添加一个作为位掩码的元属性,但其工作方式与选项 1 中提到的数组类似。不过,这对客户来说可能更难理解。

  3. 使用我还没有找到的标准方式。

布拉杰

【问题讨论】:

    标签: serialization null protocol-buffers delta


    【解决方案1】:

    Protobuf 3 不太适合这种情况。但在 protobuf 2 中,您可以拥有一个存在但值为 null 的字段。

    因为 protobuf 2 不会很快消失,我建议仅将其用于此类目的。

    【讨论】:

      【解决方案2】:

      我只是想对此发表后续文章并解释我的所作所为。

      正如@jpa 正确指出的那样,protobuffers 不是用于增量压缩的。

      所以我解决它的方法是使用一些元属性并依赖该约定。我与使用数据的人有着密切的合作伙伴关系,因此可以就约定达成一致。

      1. 专门设置为 null 的值

        我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当属性设置为 null 时,我会将属性标记添加到此数组中,这样就表明它已在该消息更新中专门设置为 null。

      2. 被清空的数组

        这与空数组的工作方式相同。我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当一个数组被清空时,我会将属性标签添加到这个数组中,这样就表明它已经被专门清空了那次消息更新。

      3. 被删除的对象

        为了表示一个对象已被删除,我添加了一个布尔属性,表示该对象已被删除。当对象被删除时,我会将此值设置为 true,否则为 null,因此它不会占用消息中的空间。生成的消息是该对象的键标识符和指示该对象已被删除的布尔值。

      它要求客户理解约定,否则效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-15
        • 2019-05-26
        • 2016-03-30
        • 2016-03-21
        • 2018-09-08
        相关资源
        最近更新 更多