👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:Java应届第一年规划 ");
文章目录
- 背景
- 明确目标
- 调研
- 性能测试
- 代码修改
- bug修改
- 线上测试并评估
- 最后
背景
完整的优化流程我做了什么工作,这里以MQ序列化优化方案为例进行讲解。工作的第一个需求,如何优化MQ,提高性能减少落盘存储占用。
明确目标
最终目标:在不加机器和不修改原配置的情况下提高性能。
排除机器和配置后影响性能的关键因素:序列化后的大小(网络带宽的占用、MQ刷盘磁盘占用)、序列化的性能(CPU资源占用)。
- 目的:对比响应时间及并发吞吐量,选择更优的序列化方式。
- 表现:序列化和反序列化的性能、序列化之后的字节大小
具体目标
- 测量和比较序列化和反序列化的性能,以及序列化后的字节大小。
- 对比不同序列化方式的响应时间和并发吞吐量。
- 是否支持跨语言(异构系统的对接和开发语言切换)。
- 选择更优的序列化方式。
调研
首先对当前使用的FASTJSON序列化机制进行调研,了解其工作原理、优缺点以及目前存在的性能瓶颈。
调查其他主流的序列化方式,如ProtoBuf、ProtoStuff 、Kryo、Hessian 、Avro、Fury 等,比较其在性能、易用性和兼容性方面的差异。
- Protobuf: 解析性能高、序列化后数据量相对少。
- Protostuff: 基于Protobuf实现,但不涉及额外的IDL和编译步骤。对于小型消息, 性能更加有竞争力。
- Kryo :跨语言很复杂、线程不安全。
- Hessian: 序列化之后,不如fastjson。
- Avro: 非常适合动态类型语言。(适用大数据场景,未测试)
- Fury: 基于Unsafe的高性能内存操作,实现了全自动的高性能的动态序列化能力,但资料少且不是特别成熟。
性能测试
制定测试方案,对不同的序列化方式进行基准测试,收集性能数据,包括序列化和反序列化的速度、占用内存、生成的消息大小等。
使用线上的真实数据进行多次测试,确保测试结果的全面性和可靠性。
对比测试结果,选择最优的序列化方式。
- 比较数据在不同序列化方式:序列化后的字节大小
- 比较数据在不同序列化方式:在单线程序列化/反序列化的吞吐量
- 比较数据在不同序列化方式:在多线程序列化/反序列化的吞吐量
- 比较数据在不同序列化方式:资源的使用情况
- Object.toString()和JSON.toJSONString(Object) 性能和大小对比
- 封装成工具类模拟优化前后生产者和消费者使用的序列化方式的吞吐量对比
MQ消息序列化优化
- MQ数据传递时支持多种序列化,在配置中指定一种序列化方式(粒度大小:topic)
- 生产者传递消息时获取该topic的序列化方式,消费者根据指定的方式反序列化;
代码修改
根据调研和测试结果,选择最优的序列化方案,并对现有代码修改新增新的序列化方式并兼容原来的序列化方式。(如有生产意外,可以使用原来的序列化方式进行兜底)
先以最小影响修改项目代码,优化序列化和反序列化逻辑,确保新方案能够无缝集成到现有系统中。
在修改代码时注意带来的影响,并需要考虑是否可以接受。
bug修改
在代码修改和测试过程中,发现并修复bug,确保优化后的系统稳定运行。
思考为什么会出现这些bug,为什么没有考虑到。
线上测试并评估
在非生产环境中部署新的序列化方案,进行不同序列化方式的测试,确保新方案在真实环境中的性能表现。
监控系统性能指标:CPU使用率、内存占用、网络带宽等,评估新方案的影响。
评估通过后,扩大修改范围,最终实现全项目的兼容实现。
最后
慢慢的来,别着急!学会有质量的走过每一步
我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路
欢迎交流,一起加油