protobuf使用遇到一个坑

项目压力测试,发现一个协议非常卡,吞吐量不足100/s,查看那个协议,发现是在玩家登陆成功后取玩家数据。

这个protobuf结构体 A 中定义了接近300个属性。

专门测试了一下,生成100000个对象,属性全不设置使用默认值,A结构体序列化是仅有几个属性的40倍消耗。

这个地方是我们之前没有想到的情况,不过这还不足已是瓶项的原因。

再继续确认,发现A里面有一个list,list中存放了271个B结构体。大约40%的时间都消耗在这里了。

基本上以下是我们之前未发现的:

1、protobuf属性多了会导致性能下载,既然属性值使用optional,而且不设置值。属性尽量控制在比较少的范围内。

2、属性多了后,感觉性能消耗是几何数级增加。

针对我们项目目前的情况,A结构体进行拆分不太可能,所以只把其中几个数量多的list拆分出来。把上面的271个使用另外一个协议发送,每次发送一条,总共发送271条。可能会感觉271条协议比一个协议要慢,实际上发现,这样做了后,问题顺利解决,271条比1条消耗的时间要小2个数量级,可能protobuf天生只适合小数据包的情况。

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>