关于序列化框架的通用性和性能选型
- 通用性:序列化框架的通用性主要体现在跨语言和跨平台两个方面。如果项目初期或者未来有跨语言或者跨平台的需求,则必须考虑序列化框架的通用性,确保所选的序列化框架满足项目需求。跨语言指的就是前面说的支持异构语言,选择跨语言的序列化框架有两个方案,第一个方案是直接选择文本格式的序列化方案,因为文本格式的序列化方案天生就支持异构语言。无论是哪种编程语言,都能够反序列化文本格式的数据。第二个方案是选择二进制格式的序列化方案,但是必须选择支持异构语言的序列化方案,比如Hessian这种实现了多个编程语言版本的序列化方案,或者是ProtoBuf这种通过IDL文件支持异构语言的序列化方案。
- 性能:性能是序列化框架非常重要的指标。序列化框架的性能可以从时间开销和空间开销两个方面来考量。空间开销可以分为两个方面,第一是序列化框架在序列化或者反序列化过程中对系统内存的开销。比如前面提到的Fastison中使用SymbolTable算法缓存关键字,避免创建重复的关键字,这样可以减少许多内存的开销。第二就是序列化后的数据大小。在文本序列化方案中,无论是JSON格式还是XL格式,都在原始的数据上添加了一些数据描述,比如JSON格式数据中的“0”等,所以文本序列化方案中序列化得到的数据非常大。但是在二进制序列化方案中,可以对数据做压缩,并且还能简化数据类型描述,所以二进制序列化方案序列化后的数据远远小于文本序列化方案序列化后的数据。序列化后的数据大小对于RPC调用来说尤为重要,因为数据包越小,意味着一次 RPC 调用所需传输的数据包就越小,这样可以提升 RPC调用的性能,增加服务端的吞吐量。时间开销则是序列化和反序列化的总耗时,也是就这两个过程的性能。复杂的序列化协议会导致序列化和反序列化耗时较长,这可能会使得序列化和反序列化阶段成为整个系统性能的瓶颈。上述指标只能排除一部分序列化框架,最终还需要通过对候选的序列化框架进行压测,得出压测结果才能下定论。