Hazelcast 5.1.3迁移后Java序列化致性能下降,求替代实现方案
解决Hazelcast 5.x迁移中Java序列化性能问题的替代方案
1. 用Portable序列化——不用动几千个业务类
Portable是Hazelcast自带的另一种序列化方式,支持部分字段读写,关键是不用修改原有业务类的代码。你只需要:
- 给每个需要序列化的业务对象写一个对应的Portable实现类,负责对象的读写逻辑
- 在Hazelcast配置里注册对应的PortableFactory
这种方式只需要新增适配类,不用动原有业务代码,工作量比改几千个类小太多。
2. 用Compact序列化——Hazelcast 5.x官方推荐的轻量方案
Compact是Hazelcast 5.0之后推出的新序列化格式,同样可以不用改业务类:
- 编写Schema描述业务对象的字段结构,类似JSON的结构定义
- 注册Schema到Hazelcast配置,再写个简单的适配器类负责对象和Compact格式的转换
如果愿意给业务类加几个注解,还能自动生成Schema,更省事儿。性能比Java序列化强很多,而且是官方主推的方向。
3. 集成Kryo序列化——第三方高性能自动序列化
Kryo是业界常用的高性能序列化库,Hazelcast直接支持集成。它能自动序列化绝大多数Java对象,基本不用改代码:
- 添加
hazelcast-kryo-serializer依赖 - 在Hazelcast配置里开启Kryo序列化,指定要序列化的类或者直接设为默认
Kryo的序列化速度比Java序列化快好几倍,配置简单,适合快速救急。
4. 临时优化Java序列化——应急过渡用
如果上面的方案都来不及做,可以先优化Java序列化顶一阵:
- 开启Hazelcast的java序列化过滤配置,减少不必要的类序列化
- 给所有业务类加上
serialVersionUID,避免序列化时的类校验开销 - 调整JVM参数,比如关闭序列化调试信息
但这只是临时办法,长期还是得换成前面的高性能方案。
注意点
- 不管选哪种方案,先在测试环境跑一遍,验证性能和兼容性,别上线出问题
- 集群所有节点的序列化配置必须一致,不然跨节点读写会报错
内容的提问来源于stack exchange,提问作者Safvan Kothawala
相关产品推荐
相关产品推荐

