Protobuf

p_siwliu

互联网起来初期,web服务使用http + json对外,后端再接个数据库就可以了。那个时候也没有微服务的概念,一个单体跑跑,不需要服务之间rpc调用,也就不太需要请求/响应序列化,反序列化。对于内部的非web服务,服务之间可能直接把struct序列化然后传输就可以了,也不考虑版本兼容性,甚至大小端都不考虑。

直到2000年左右Google之类大型互联网公司起来,他们自己内部有大量的服务,之间需要互相调用。

内部服务调用的一个特点是:传输所花费的时间比外部服务更少一些,因此序列化/反序列化的时间占比就提高了。内部调用凸显出 rpc 的重要性,也凸显出高效序列化、反序列化,和版本兼容的重要性。所以大厂们都采用IDL来对数据进行描述,比如,百度当时自己也有一套IDL,但是没有protobuf好用。google内部很早就在使用protobuf了,做了很多优化,并在2008年左右进行了开源(没有开源rpc部分),也就是protobuf 2.0。由于是Google家的开源产品,支持各种语言,在当时也确实是优化最好的IDL了(字节编码这些东西,在当时确实是眼前一亮,尽管不是什么新技术)。所以慢慢就流行开来,很多大厂也开始使用。

大厂的人跳槽,创业,继续推广开来。后来大家看google一直不开源rpc,那么我们自己来吧,但没人会从IDL开始搞,自然就直接使用protobuf作为rpc的IDL了,进一步推广了protobuf。另外,Google自己的产品当然也会首选protobuf最为数据格式了,google本身又是个热衷于开源的公司,当然也就更近一步推广了(比如Tensorflow)。

没有什么东西是one-fit-all的,用的人多了,业务场景多了,自然吐槽的就多了。同时Facebook等新的大厂也加入到了开源队伍(Thrift,同时还开源了rpc),互相卷,互相拆桥。当然protobuf自身也存在一些问题,所以后来google自己又搞了protobuf 3.0,另外还搞了个flatbuffer。

又过了好多年,google才开源了终于开源了GRPC……

所以个人认为,之所以会流行是因为:开源得早 + 确实做得好(尽管存在各种问题)+ 生态

Last updated