【问题标题】:Using google protobuffer for delta messages使用 google protobuf 处理增量消息
【发布时间】:2017-08-14 09:10:19
【问题描述】:
我正在研究使用 Google Protobuffers 进行增量消息传递。这意味着我只想发送我的域对象的更改值。
但这暴露了用于此目的的协议问题。我可以轻松地忽略未更改的属性,这将为我们提供简洁的信息。
但是那些将值从_something_ 更改为null 的属性呢?在协议缓冲区中无法区分这两种情况。
其他人在这里做了什么?我正在研究几种不同的解决方案:
为所有对象添加一个元属性,即一个int数组。如果任何属性应更改为 null,请在此数组中包含字段编号。如果没有属性更改,则元属性将被忽略,并且不会占用消息中的带宽。
添加一个作为位掩码的元属性,但其工作方式与选项 1 中提到的数组类似。不过,这对客户来说可能更难理解。
使用我还没有找到的标准方式。
布拉杰
【问题讨论】:
标签:
serialization
null
protocol-buffers
delta
【解决方案1】:
Protobuf 3 不太适合这种情况。但在 protobuf 2 中,您可以拥有一个存在但值为 null 的字段。
因为 protobuf 2 不会很快消失,我建议仅将其用于此类目的。
【解决方案2】:
我只是想对此发表后续文章并解释我的所作所为。
正如@jpa 正确指出的那样,protobuffers 不是用于增量压缩的。
所以我解决它的方法是使用一些元属性并依赖该约定。我与使用数据的人有着密切的合作伙伴关系,因此可以就约定达成一致。
-
专门设置为 null 的值
我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当属性设置为 null 时,我会将属性标记添加到此数组中,这样就表明它已在该消息更新中专门设置为 null。
-
被清空的数组
这与空数组的工作方式相同。我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当一个数组被清空时,我会将属性标签添加到这个数组中,这样就表明它已经被专门清空了那次消息更新。
-
被删除的对象
为了表示一个对象已被删除,我添加了一个布尔属性,表示该对象已被删除。当对象被删除时,我会将此值设置为 true,否则为 null,因此它不会占用消息中的空间。生成的消息是该对象的键标识符和指示该对象已被删除的布尔值。
它要求客户理解约定,否则效果很好。