protobuf网络传输协议的优缺点

为什么使用protobuf?

protobuf常使用于作为C/S之间的数据传输的序列化工具,可以使用protobuf实现rpc框架的通信传输。

对于App网络传输协议,我们比较常见的、可选的,有三种,分别是json/xml/protobuf,我们先分别来看看这三种格式的优缺点:

三种格式优点:

  • json优点就是较XML格式更加小巧,传输效率较xml提高了很多,可读性还不错。
  • xml优点就是可读性强,解析方便。
  • protobuf优点就是传输效率快(据说在数据量大的时候,传输效率比xml和json快10-20倍),序列化后体积相比Json和XML很小,支持跨平台多语言,消息格式升级和兼容性还不错,序列化反序列化速度很快。

三种格式缺点:

  • json缺点就是传输效率也不是特别高(比xml快,但比protobuf要慢很多)。
  • xml缺点就是效率不高,资源消耗过大。
  • protobuf缺点就是使用不太方便。

在一个需要大量的数据传输的场景中,如果数据量很大,那么选择protobuf可以明显的减少数据量,减少网络IO,从而减少网络传输所消耗的时间。考虑到作为一个主打社交的产品,消息数据量会非常大,同时为了节约流量,所以采用protobuf是一个不错的选择。

详看protobuf:

protobuf的优点:

  1. 性能好/效率高

    时间开销: XML格式化(序列化)的开销还好;但是XML解析(反序列化)的开销就不敢恭维了。 但是protobuf在这个方面就进行了优化。可以使序列化和反序列化的时间开销都减短。

    空间开销:也减少了很多

  2. 有代码生成机制

    比如你写个一下类似结构体的内容

 message testA  
{  
    required int32 m_testA = 1;  
} 

像写一个这样的结构,protobuf可以自动生成它的.h 文件和点.cpp文件。
protobuf将对结构体testA的操作封装成一个类。

  1. 支持向后兼容和向前兼容

    当客户端和服务器同事使用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户端的使用

  2. 支持多种编程语言

    在Google官方发布的源代码中包含了c++、java、Python三种语言

protobuf缺点

  1. 二进制格式导致可读性差

    为了提高性能,protobuf采用了二进制格式进行编码。这直接导致了可读性差。这个直接影响开发测试时候的效率。当然,一般情况下,protobuf非常可靠,并不会出现太大的问题。

  2. 缺乏自描述

    一般来说,XML是自描述的,而protobuf格式则不是。 给你一段二进制格式的协议内容,不配合你写的结构体是看不出来什么作用的。

(注释:XML自描述性的意思是XML是独立于其他平台定义的,例如XML 定义了一个User 的结构,用来在java平台和c平台交换数据,
这个User 的XML结构不需要依赖java中的类结构, 也不需要依赖c中的结构体,而是自己定义的XSD或者DTD,
java和c只要按照这个xsd或者dtd去解析XML就可以了。)

  1. 通用性差

    protobuf虽然支持了大量语言的序列化和反序列化,但仍然并不是一个跨平台和语言的传输标准。在多平台消息传递中,对其他项目的兼容性并不是很好,需要做相应的适配改造工作。相比json 和 XML,通用性还是没那么好。

参考文章:
基于Protobuf的简单RPC框架实现原理
Protobuf的优点

你可能感兴趣的:(专业团队-学习笔记,网络,protobuf)