家族战队|Java 序列化界新贵 kryo 和熟悉的“老大哥”
本文适合有 Java 基础知识的人群
作者:HelloGitHub-Salieri
HelloGitHub 推出的《讲解开源项目》系列 。
项目地址:
序列化与反序列化一直是分布式编程中无法绕开的话题 。 PowerJob 作为一个完全意义上的分布式系统 , 自然少不了节点通讯时不可避免的序列化问题 。 由于 PowerJob 定位是中间件 , 出于对性能的追求 , 在序列化上自然也是花费了不少时间去雕琢 。 以下是整个过程中的一些经验与分享 , 希望对大家有所帮助 。
一、序列化界新贵:kryokryo 作为目前最快的序列化框架 , 自然受到了我的青睐 。 在 PowerJob 中 , kryo 是内置默认的序列化框架 。 下面为大家介绍 kryo 的用法 。
1.1 基础用法对于序列化框架来说 , API 其实都差不多 , 毕竟入参和出参都定义好了(一个是需要序列化的对象 , 一个是序列化后的结果 , 比如字节数组) 。 下面简单介绍下 kryo 的基础用法 , 由于序列化和反序列化类似 , 以下使用序列化来作为演示 。
Kryo kryo = new Kryo();try (Output opt = new Output(1024, -1)) {kryo.writeClassAndObject(opt, obj);opt.flush();return opt.getBuffer();}代码很简单 , 首先需要创建两个对象:Kryo 和 Output 。 其中 , Kryo 是序列化主角 , 负责完成实际的序列化/反序列化工作 。 而 Output 则是 kryo 框架封装的流对象 , 用于存储序列化后的二进制数据 。 当两个对象都准备完毕后 , 调用 kryo.writeClassAndObject(opt, obj) 方法即可完成对象的序列化 , 最后调用 Output 流对象的 getBuffer() 方法获取序列化结果 , 也就是二进制数组 。
1.2 线程不安全相信大家都用过 fastjson , 初次接触 fastjson 肯定会被它简单的 API 所吸引 , 常用的序列化/反序列化统统一行代码搞定 , 比如 JSON.toJSONString() 。 通常来说 , 这种通过静态方法暴露的 API , 其背后的设计与实现都是线程安全的 , 也就是在多线程环境中 , 你可以安心的使用 fastjson 的静态方法进行序列化和反序列化 , 那么 kryo 可以吗?
从上述代码不难看出 , 不可以~否则 , 人家为什么要多次一举让你创建对象提高使用成本呢?
王进喜同志说过 , 没有条件就创造条件 。 既然 kryo 官方不提供静态方法让我们简单使用 , 那就自己封装一个吧~
抛开性能因素 , 封装一个工具类非常简单 , 毕竟我们的目标是解决 kryo 的并发安全问题 , 而当没有任何共享资源时 , 是不存在任何并发安全问题的 。 那么我们只需要在刚刚的实例代码上 , 套上一个静态方法 , 就完成了最简单的kryo 工具类封装 , 代码示例如下:
【家族战队|Java 序列化界新贵 kryo 和熟悉的“老大哥”】public static byte[] serialize(Object obj) {Kryo kryo = new Kryo();try (Output opt = new Output(1024, -1)) {kryo.writeClassAndObject(opt, obj);opt.flush();return opt.getBuffer();}}安全问题是解决了 , 但...事情往往不会那么简单 。 这种模式下 , 每一次调用都会重复创建 2 个新对象(Kryo 和 Output) , 这在高并发下会产生一笔不小的开销 。 为了获取性能的提升 , 自然要考虑到对象的复用问题 。 对象的复用常用解决方案有两个 , 分别是对象池和 ThreadLocal , 下面分别进行介绍 。
1.3 对象池在编程中 , “池”这个名词相信大家一定不陌生 。 线程池、连接池已经是并发编程中不可避免的一部分 。 “池”重复利用了复用的思想 , 将创建完后的对象通过某个容器保存起来反复使用 , 从而达到提升性能的作用 。 Kryo 对象池原理上便是如此 。 Kryo 框架自带了对象池的实现 , 因此使用非常简单 , 不外乎创建池、从池中获取对象、归还对象三步 , 以下为代码实例 。
推荐阅读
- 爱游戏的甲子|G2战队“杀人诛心”,阿P用两句话嘲讽LCK战队,DWG被逼入绝境
- 老猫要有腹肌|AG超玩会战队人气位列榜首,久诚人气不及一诺
- 财经女记者部落|老板却坚决拒绝粉丝经济,选手只招大学生,电竞战队斩获《炉石传说》联赛冠军
- 电竞小肥仔|和平精英:战队专属皮肤推荐合集,最后JDE队服堪比至尊金龙!
- 海军陆战队|美两大军种争资源,抢着对抗中国?美专家:对手导弹太多,应互补
- 4am战队|绝地求生秋季赛决赛第一日-rng登顶,4am稳定,ifty、tianba拉闸
- 麻醉说游戏|KPL秋季赛一半赛程已过!这两支战队即将提前锁定胜者组?
- 指尖上的王者|KPL五周T队排名,“天王级”战队只有两个,TS被踢出队列
- tes战队|“给阿水下了毒”就在今天,Rookei对TES让二追三做出评价,差点吓跑了!
- dwg战队|“打LCK胜率高有秘诀”就在今天,G2晋级4强全员喊话DWG,你们不是我对手!
