概况
这篇文章会讲一下序列化的重要性和序列化工具的选型。
我们在系统间接口的调用中,基本上都会用到序列化和反序列化。下图是订单中心从用户中心获取用户的场景,会发生以下动作。
1 用户中心先将User对象序列化为json字符串
2 然后通过网络将json字符串传送到订单中心
3 订单中心将json字符串反序列化为User对象,然后接着做下面的业务操作
在上面的例子中,序列化和反序列化主要影响有两点:
1 序列化和反序列化的时间(或者说消耗的资源)
2 序列化后的大小
序列化工具的选型会对机器和网络都会造成影响,如果每次序列化消耗的资源过高,那么在较高的并发下,机器资源会造成系统性能的瓶颈。同样的,如果序列化后的包体大小很大,那么在较高的并发下,数据会占满带宽,这将会对业务造成很大的影响。
下图是报文占满带宽的情景。
序列化工具的比较
非JSON:
工具名 | 版本 | 消耗时间(10万次序列化) | 消耗时间(10万次反序列化) | 序列化包体大小 |
---|---|---|---|---|
jprotobuf | jprotobuf 2.4.9 | 107ms | 30ms | 11字节 |
hessian | 4.0.65 | 20ms | 33ms | 51字节 |
Kyro | 5.2.0 | 22ms | 53ms | 8字节 |
JSON:
工具名 | 版本 | 消耗时间(10万次序列化) | 消耗时间(10万次反序列化) | 序列化包体大小 |
---|---|---|---|---|
fastjson | 1.2.78 | 220ms | 81ms | 27字节 |
jackson | 1.9.13 | 169ms | 165ms | 27字节 |
gson | 2.8.8 | 180ms | 140ms | 27字节 |
总结:
1 如果是使用json的话,fastjson可能相对性能好一点点
2 Kyro序列号的包体最小,如果公司租用的带宽较小,可以考虑kyro
3 hessian,Kyro性能都很好,但是hessian序列化后的包体比较大,如果公司服务器性能是瓶颈,可以考虑Kyro
下面是本次测试的代码,代码路径是 org.example.App。
测试代码:https://gitee.com/shenduedu/serialdemo.git