前言
首先应该能够清晰的分辨RPC、序列化、数据压缩之间的关系及区别,本节不讨论具体技术细节,旨在理解概念和建议的序列化协议选择。
- RPC是一种抽象的一般跨网络的通信框架,主要目的是屏蔽网络调用的复杂性,基于RPC框架我们可以更容易的在分布式环境中进行网络调用。
- 数据压缩指通过技术手段在存储、计算、时间之前平衡,常见的通过编码技术对数据进行压缩以减少在网络中传输的字节量,同时不减少信息量。
- 序列化通常指将一系列互相依赖的对象,持久化到外部系统,可以文件、网络等,主要目的是允许对象及其关系可以从一个网络环境输出到另一个网络环境。
通常情况下,RPC技术伴随着消息的输出和输出,在面向对象的体系中,基于对象的消息传输即通过序列化技术进行信息交换。序列化的过车通常伴随着对象信息的压缩。主要还是要理解这里的压缩和传统的我们认为的压缩的区别,大部分场景下RPC中的数据压缩不同于我们对一个文件,图片的压缩,更多的是采用编码技术进行数据压缩如将INT类型的固定4字节编码为变长字节。可能一个INT可以使用2字节就可以存储。
常见的RPC技术
目前比较流行的基于HTTP协议的Spring Cloud;基于TCP协议的DUBBO;以及Hessian、Avro等针对特定业务类型而产生的RP框架。本质上来说RPC框架一般是基于现有的网络协议或者网络框架来实现的。比如我们可以基于Netty\Mina等实现自己的RPC框架。
常见的序列化协议
常见的序列化框架有AVRO、Hessian、Kryo、Protobuf、Protostuff、Thrift等。
- Avro,Avro框架不仅提供了数据的序列化同时也提供了基于AVRO的RPC框架,一般在Hadoop生态圈内用的比较多,且其针对Hadoop项目提供了诸多的优化,建议如果可能序列化的数据和Hadoop项目相关可以优先考虑Avro,Avro用起来还是比较麻烦的,数据中自带序列化所需要的Schema信息。
- Hessian,Hessian主要在提供一个RPC框架,序列化也是其自带的属性,建议如果使用了Hessian作为RPC框架可以选择Hessian的序列化。
- Kryo,最近在接触的,是一个比较纯粹的序列化框架,API简单、性能高,压缩比高,适合只想序列化数据的场景,是目前个人比较推荐的序列化框架。但是、Kryo序列化后的对象是不兼容的,如果你在设计一个将对象序列化进而持久存储的系统需要慎重考虑。
- Protobuf,Google出品必属精品,Protobuf是一个序列化框架,主要还是因为要使用Protobuf序列化必须先写一个.proto的协议文件,同时生成对应的代码。
- Protostuff,是Protobuf的升级,可以进行运行时序列化而不是预先定义一个协议文件,Protostuff是类型和版本兼容的序列化协议,其用注解元素在序列化数据中标识了字段的元数据信息。
- Thrift是一个完整的RPC解决方案,更适合RPC方案级别的选择,支持多语言。
序列化协议选型
- 如果你需要一个RPC框架,且不打算自己实现太多的东西可以先选择一个RPC框架,一般我们都会使用RPC框架自带的序列化协议。
- 对性能要求极致、对细节把控要求严格的场景下不妨自己基于一些高性能的TCP通信组件Netty、Mina组合期望的序列化协议来实现自定义的RPC通信场景
- 如果仅仅是用于短暂的序列化数据交换,不计划作为长期的持久存储,Kryo是不错的选择,
- 考虑序列化数据的兼容性,同时兼顾性能、复杂程度可以考虑Protostuff 等。
我觉得,根据自己的理解,使用经历,团队意向来选择一个适合自己当时技术体系、认知的框架才是最好的。技术本身就在变,况且大部分场景下性能都能得到满足,只是你只能选择一个。