对增量消息使用 google protobuffer
Using google protobuffer for delta messages
我正在研究使用 Google Protobuffers 进行增量消息传递。这意味着我只想发送域对象的更改值。
但这暴露了用于此目的的协议的问题。我可以很容易地忽略没有改变的属性,这将为我们提供一个紧凑的信息。
但是将值从 _something_
更改为 null
的属性呢?在protocol buffer中是无法区分这两种场景的。
其他人在这里做了什么?我正在寻找几个不同的解决方案:
给所有对象添加一个meta 属性,也就是一个int数组。如果任何属性应更改为 null,请在此数组中包含字段编号。如果没有属性发生变化,那么元 属性 将被忽略,不会占用消息中的带宽。
添加一个元属性,它是一个位掩码,但工作方式类似于选项 1 中提到的数组。虽然这可能让客户更难理解。
使用我还没有找到的标准方法。
BR 周杰伦
Protobuf 3 不太适合这个。但是在 protobuf 2 中,你可以有一个存在但值为 null 的字段。
因为 protobuf 2 不会很快消失,我建议只将它用于此类目的。
我只是想 post 对此进行跟进并解释我所做的事情。
正如@jpa 正确指出的那样,protobuffer 不是为增量压缩而设计的。
所以我解决它的方法是使用一些元属性并依赖于该约定。我与使用数据的人有密切的合作关系,因此可以就约定达成一致。
专门设置为 null 的值
我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当 属性 设置为 null 时,我会将 属性 标记添加到此数组,这样表明它已在该消息更新中明确设置为 null。
被清空的数组
这与 null 数组的工作方式相同。我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当一个数组被清空时,我会在这个数组中添加 属性 标签,这样就表明它在消息更新时被特别清空了。
已删除的对象
为了表示一个对象已经被删除,我添加了一个布尔值属性来表示这个对象已经被删除了。当对象被删除时,我会将此值设置为 true,否则为 null,因此它不会占用消息中的 space。结果消息是该对象的键标识符和指示它已被删除的布尔值。
它要求客户理解约定,否则效果很好。
我正在研究使用 Google Protobuffers 进行增量消息传递。这意味着我只想发送域对象的更改值。
但这暴露了用于此目的的协议的问题。我可以很容易地忽略没有改变的属性,这将为我们提供一个紧凑的信息。
但是将值从 _something_
更改为 null
的属性呢?在protocol buffer中是无法区分这两种场景的。
其他人在这里做了什么?我正在寻找几个不同的解决方案:
给所有对象添加一个meta 属性,也就是一个int数组。如果任何属性应更改为 null,请在此数组中包含字段编号。如果没有属性发生变化,那么元 属性 将被忽略,不会占用消息中的带宽。
添加一个元属性,它是一个位掩码,但工作方式类似于选项 1 中提到的数组。虽然这可能让客户更难理解。
使用我还没有找到的标准方法。
BR 周杰伦
Protobuf 3 不太适合这个。但是在 protobuf 2 中,你可以有一个存在但值为 null 的字段。
因为 protobuf 2 不会很快消失,我建议只将它用于此类目的。
我只是想 post 对此进行跟进并解释我所做的事情。
正如@jpa 正确指出的那样,protobuffer 不是为增量压缩而设计的。
所以我解决它的方法是使用一些元属性并依赖于该约定。我与使用数据的人有密切的合作关系,因此可以就约定达成一致。
专门设置为 null 的值
我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当 属性 设置为 null 时,我会将 属性 标记添加到此数组,这样表明它已在该消息更新中明确设置为 null。
被清空的数组
这与 null 数组的工作方式相同。我在消息中添加了一个 int 数组。这个 int 数组大部分时间是空的,对消息大小没有影响。当一个数组被清空时,我会在这个数组中添加 属性 标签,这样就表明它在消息更新时被特别清空了。
已删除的对象
为了表示一个对象已经被删除,我添加了一个布尔值属性来表示这个对象已经被删除了。当对象被删除时,我会将此值设置为 true,否则为 null,因此它不会占用消息中的 space。结果消息是该对象的键标识符和指示它已被删除的布尔值。
它要求客户理解约定,否则效果很好。