使用Google Protobuffer来传送增量消息。

3
我正在研究使用Google Protobuffers进行Delta消息传递。这意味着我只想发送域对象中已更改的值。
但这引出了一个问题,即用于此目的的协议存在问题。我可以轻松地省略未更改的属性,这将呈现简洁的消息。
但是对于从“_something_”到“null”的值发生更改的属性怎么办?在协议缓冲区中无法区分这两种情况。
其他人在这里做了什么?我正在查看几种不同的解决方案:
1. 为所有对象添加一个meta属性,该属性是int数组。如果任何属性应更改为null,则在该数组中包括字段号。如果没有属性更改,则忽略元属性,并且不会在消息中占用带宽。 2. 添加一个位掩码的元属性,但与选项1中提到的数组类似。不过这可能更难让客户端理解。 3. 使用我尚未能找到的标准方法。
敬礼,Jay
2个回答

2

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

由于protobuf 2短时间内不会消失,我建议仅在此类情况下使用它。


2
我想对此进行跟进并解释一下我所做的事情。
正如@jpa正确指出的那样,Protocol Buffers不适用于增量压缩。
因此,我解决的方法是使用一些元属性,并依赖于该约定。我与消费数据的人有着紧密的合作关系,因此可以达成共识。
1. 显式设置为null的值 我已经向消息添加了一个int数组。这个int数组大多数时候都是空的,对消息大小没有影响。当属性被设置为null时,我将在此数组中添加属性标记,从而表明它在该消息更新中已经被显式地设置为null。
2. 清空的数组 这与空值数组的方式相同。我已经向消息添加了一个int数组。这个int数组大多数时候都是空的,对消息大小没有影响。当一个数组被清空时,我将在此数组中添加属性标记,从而表明它在该消息更新中已经被清空。
3. 已删除的对象 为了表明对象已被删除,我添加了一个布尔属性来指示对象已被删除。当对象被删除时,我将将此值设置为true,否则为null,以便不占用消息中的空间。结果消息是该对象的关键标识符和指示其已删除的布尔值。
这需要客户端理解约定,但除此之外它工作得相当好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接