使用谷歌protobuffer进行增量消息

时间:2017-08-14 09:10:19

标签: serialization null protocol-buffers delta

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

但是为此目的暴露了协议的问题。我可以很容易地省略没有改变的属性,这将为我们提供一个紧凑的消息。

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

其他人在这做了什么?我正在寻找一些不同的解决方案:

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

  2. 添加一个比特掩码的元属性,但其作用类似于选项1中提到的数组。但客户可能更难理解这一点。

  3. 使用我尚未找到的标准方式。

  4. BR Jay

2 个答案:

答案 0 :(得分:1)

我只是想对此进行跟进并解释我的所作所为。

正如@jpa正确指出的那样,protobuffers不能用于delta压缩。

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

  1. 专门设置为null的值

    我在消息中添加了一个int数组。这个int数组在大多数时间都是空的,并且对消息大小没有影响。当一个属性设置为null时,我会将属性标记添加到此数组,并且这表示在该消息更新中已将其特别设置为null。

  2. 清空的数组

    这与nulls数组的工作方式相同。我在消息中添加了一个int数组。这个int数组在大多数时间都是空的,并且对消息大小没有影响。当一个数组被清空时,我会将属性标记添加到这个数组中,这样就表明它已经特意清空了该消息更新。

  3. 已删除的对象

    为了表明某个对象已被删除,我添加了一个布尔属性,表明该对象已被删除。删除对象时,我将此值设置为true,否则为null,因此它不占用消息中的空间。结果消息是该对象的密钥标识符,以及指示它被删除的布尔值。

  4. 它要求客户理解约定,否则它的效果非常好。

答案 1 :(得分:0)

Protobuf 3不太适合这个。但是在protobuf 2中,你可以有一个存在的字段但值为null。

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