ruanchao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  需要序列化的场景:1、CPU架构不同,X86/ARM等大小端问题; 2、数据存储介质不同,磁盘/内存等; 3、数据地址不连续,需要分段读取并传输。

 

  序列化要考虑的问题:1、语言无关,实现多语言互通;2、数据量尽量小,提高通信效率。

 

  在相当长的一段时间里,基于XML格式的SOAP协议和骑上的WebService框架,成为各个主流开发语言的必备扩展包;后来基于JSON的简单文本格式编码的HTTP REST接口,取代了复杂的WebService接口,成为事实上的分布式远程通信的首选。

  但是JSON占用空间大、性能低下,而越来越多的移动客户端应用需要更高效地传输数据,因此语言无关的高效二进制编码协议成为关键技术之一。

  MessagePack,出现比Google的Protocol Buffers更早,是模仿JSON设计的一个高性能二进制通用序列化框架,空间占用更小、更快。MessagePack数据类型分为两种:定长和变长。定长数据,只需要标明数据类型type和数据值value;变长数据,还需要增加一个数据长度的描述。而且为了节省空间,数据类型还做了细分,例如正负数。

  ProtocolBuffers,定义了proto描述文件,描述数据对象的具体结构,这些数据对象又被称为“message消息”,然后编译生成各种语言的接口,实现了语言无关。和MessagePack类似,为了节省空间,ProtoBuff也有一些技巧,例如Varint是变长整数类型,用一个或多个字节来表示一个数字,数字越小,字节数越小。

  FlatBuffers,Google在ProtoBuff之后又开源了一个新项目,在性能、内存占用、第三方依赖库的数量、编译后生成的中间代码数量等等方面做了大幅改进。

  Avro,Apache Hadoop的一个子项目,用于实现RPC调用;Hadoop的其他项目,例如HBase、Hive的Client端与Server端也使用了Avro传输数据。Avro和ProtoBuff最大区别是预先定义Schema(模式)来描述对象的序列化结构,无需编译过程。Schema使得数据具有自描述的功能,同时能实现动态加载,大大加速了各种格式数据传输的开发联调工作。

 

参考《架构解密-从分布式到微服务》

 

posted on 2021-05-05 22:34  ruanchao  阅读(75)  评论(0编辑  收藏  举报