完整的优化流程需要做什么工作

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:Java应届第一年规划 ");

文章目录

    • 背景
    • 明确目标
    • 调研
    • 性能测试
    • 代码修改
    • bug修改
    • 线上测试并评估
    • 最后

背景

完整的优化流程我做了什么工作,这里以MQ序列化优化方案为例进行讲解。工作的第一个需求,如何优化MQ,提高性能减少落盘存储占用。

明确目标

最终目标:在不加机器和不修改原配置的情况下提高性能。

排除机器和配置后影响性能的关键因素:序列化后的大小(网络带宽的占用、MQ刷盘磁盘占用)、序列化的性能(CPU资源占用)。

  • 目的:对比响应时间及并发吞吐量,选择更优的序列化方式。
  • 表现:序列化和反序列化的性能、序列化之后的字节大小

具体目标

  1. 测量和比较序列化和反序列化的性能,以及序列化后的字节大小。
  2. 对比不同序列化方式的响应时间和并发吞吐量。
  3. 是否支持跨语言(异构系统的对接和开发语言切换)。
  4. 选择更优的序列化方式。

调研

首先对当前使用的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使用率、内存占用、网络带宽等,评估新方案的影响。
评估通过后,扩大修改范围,最终实现全项目的兼容实现。

最后

慢慢的来,别着急!学会有质量的走过每一步


我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路
欢迎交流,一起加油

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三生随记——空调的诅咒

在一个炎热的夏日,小镇上的居民们都在忍受着高温的煎熬。阳光无情地炙烤着大地,空气仿佛凝固了一般,让人喘不过气来。 杰克和艾米是一对年轻的夫妻,他们刚刚搬进了这座小镇边缘的一座古老房子。这座房子虽然宽敞,但却透…

前后端,数据库以及分布式系统

1. 前端(Frontend) 定义: 前端是用户直接与之交互的部分,通常在浏览器中运行。它负责呈现和展示数据,与用户进行交互。 关键点: HTML/CSS/JavaScript: HTML定义了页面结构,CSS负责…

Interface中的方法被default修饰

Interface中的方法被default修饰 在Java 8中,引入了default方法的概念,使得接口可以包含具体的方法实现。被default修饰的方法称为默认方法。这意味着接口不仅可以声明方法,还可以提供方法的默认实现。 默认方法的主要作用包括:…

工业网络通信教学平台-工业互联网综合教学的实验平台-工业互联网应用实训

工业互联网(Industrial Internet),也称为工业物联网或IIoT,是一个开放的、全球化的工业网络,将人、数据和机器进行连接,将工业、技术和互联网深度融合。 工业互联网产业发展离不开信息技术产业人才&#xf…

Elasticsearch 聚合查询简介

Elasticsearch 聚合查询简介 在 Elasticsearch 中,聚合(Aggregations)是一种强大的数据分析工具,可以让你从数据中提取有意义的信息。通过聚合查询,可以对数据进行分类、统计、过滤和分组等操作,从而帮助用…

Android TEE SE

在Android平台上,Trusted Execution Environment (TEE) 和 Secure Element (SE) 是用来增强设备安全性的关键技术。TEE提供了隔离的执行环境,可以执行敏感的安全操作,而SE则是一个独立的、高度安全的微控制器,用于存储和处理非常敏…

Log4j的原理及应用详解(五)

本系列文章简介: 在软件开发的广阔领域中,日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程,还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂,对日志管理的需求也日…

Qt Creator的好用的功能

(1)ctrlf: 在当前文档进行查询操作 (2)f3: 找到后,按f3,查找下一个 (3)shiftf3: 查找上一个 右键菜单: (4)f4:在…

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信: 原理:异步通信(Asynchronous Communication)是一种数据传输方式,其中数据发送和接收操作在独立的时间进行,不需要在特定时刻对齐。发送方在任何时刻可以发送数据,而接收…

GitHub+Picgo图片上传

Picgo下载,修改安装路径,其他一路下一步! 地址 注册GitHub,注册过程不详细展开,不会的百度一下 地址 新建GitHub仓库存放图片 ——————————————————————————————————————————…

第二十章 Nest 大文件分片上传

在前端的文件上传功能中,只要请求头里定义 content-type 为 multipart/form-data,内容就会以下面形式传递到服务端,接着服务器再按照multipart/form-data的格式去提取数据 获取文件数据但是当文件体积很大时 就会出现一个问题 文件越大 请求的…

08-8.6.2 败者树

👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

QT使用QPainter绘制多边形维度图

多边形统计维度图是一种用于展示多个维度的数据的图表。它通过将各个维度表示为图表中的多边形的边,根据数据的大小和比例来确定各个维度的长度。 一、简述 本示例实现六边形战力统计维度图,一种将六个维度的战力统计以六边形图形展示的方法。六个维度是…

六、元组、字典、集合

文章目录 学习目标一、元组的使用二、字典的基本使用2.1 字典使用注意事项2.2 字典的增删改查2.3 update方法的使用2.4 合并多个dict2.5 字典的遍历2.6 字典的推导式三、集合的使用3.1 set的使用3.2 set的操作3.3 集合的高级用法四、eval与json五、可迭代对象通用方法5.1 运算符…

五、python列表

文章目录 学习目标一、列表的基本使用二、列表的遍历2.1 while循环遍历2.2 for...in 循环遍历三、列表的排序3.1 交换两个变量的值3.2 冒泡排序3.3 列表的排序与反转方法四、列表的复制4.1 可变数据类型与不可变数据类型4.2 列表的复制五、列表的嵌套(略)六、列表推导式学习目…

基于形状匹配原始版放出来(给有用的人参考2)

我们仍然讲学习。 昨天已经把80万像素1024*768的图像变成256*192图像了,并且使用iir高斯平滑保留了特征。 下面做的就是用roi把特征图扣出来,也就是所谓的模板,你在原图中的roi假定是200*200,那么在256*192中,就变成…

怎样在 PostgreSQL 中优化对复合索引的选择性?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对复合索引的选择性一、理解复合索引的概念二、选择性的重要性三、优化复合索…

ollama编译安装@focal jammy Ubuntu @FreeBSD jail

Ollama是一个用于在本地运行大型语言模型(LLM)的开源框架。它支持多种操作系统,但是唯独不支持FreeBSD,于是尝试在FreeBSD的jail里安装Ubuntu,Ubuntu里再安装ollama。 先上结论,好像focal jail无法编译成功…

shell脚本-linux如何在脚本中远程到一台linux机器并执行命令

需求:我们需要从11.0.1.17远程到11.0.1.16上执行命令 实现: 1.让11.0.1.17 可以免密登录到11.0.1.16 [rootlocalhost ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created d…

【问题记录】Docker配置mongodb副本集实现数据流实时获取

配置mongodb副本集实现数据流实时获取 前言操作步骤1. docker拉取mongodb镜像2. 连接mongo1镜像的mongosh3. 在mongosh中初始化副本集 注意点 前言 由于想用nodejs实现实时获取Mongodb数据流,但是报错显示需要有副本集的mongodb才能实现实时获取信息流,…