架构重构技巧

news2024/11/27 0:45:27

架构重构定义

代码重构

定义

对软件代码做任何改变以增加可读性或者简化结构而不影响输出结果

目的

增加可读性、增加可维护性、可扩展性

关键点

  1. 不影响输出
  2. 不修正错误
  3. 不增加新的功能性

架构重构

定义

通过调整系统结构(Rank、Role、Relation、Rule)来修复系统质量问题而不影响整体系统能力

目的

修复质量问题(性能、可用性、可扩展。。。)

关键点

  1. 修复质量问题,提升架构质量
  2. 不影响整体系统功能
  3. 架构本质没有发生变化

代码重构vs架构重构

代码重构架构重构
基本做法调整代码调整架构
目的优化代码,增加代码的可读性、可维护性、可扩展性修复架构质量问题
是否修复问题
是否改变系统能力
手段引入设计模式引入缓存,分库分表

架构重构技巧

架构重构手段

在这里插入图片描述

技巧

技巧1-先局部优化后架构重构

局部优化

定义

对部分业务或者功能进行优化,不影响系统架构

常见手段
  1. 数据库添加索引,优化索引
  2. 某个数据缓存更新策略采用后台更新
  3. 增加负载均衡服务数量
  4. 优化代码里面并发的逻辑
  5. 修改InnoDB buffer pool配置,分配更多内存
  6. 服务间的某个接口增加参数

架构重构

定义

优化系统架构,整体提升质量,架构重构会影响架构的4R定义

常见手段
  1. 引入消息队列(增加Role)
  2. 去掉Zookeeper,改为内置的Raft算法实现(删除Role)
  3. 将Memcached改为Redis(改变Role)
  4. 按照稳定性拆分微服务(拆分Role)
  5. 将粒度太细的微服务合并(合并Role)
  6. 将服务间的通信方式由HTTP改为gRPC(修改Relation)
  7. SDK从读本地配置文件改为从配置系统读取配置(修改Rule)

技巧2-有的放矢

要素

明确目标

不要试图解决所有问题,抓住关键问题

技巧

问题分类:问题收集列表可能有100条,不要全部想着通过架构重构解决,分门别类,找出需要架构重构解决的问题

明确时间

要有明确的时间点和里程碑,不要说“慢慢优化”

技巧

独立版本:不要混在业务版本里面做架构重构,否则不好协调资源

明确结果

需要有量化的指标来衡量,不能说“提升xxx质量”

技巧
  1. 先收集系统已有相关数据,适合项目投入、时间等
  2. 调查问券:适合效率、复杂度等

案例

在这里插入图片描述

  1. 开发效率很慢,P业务和M系统互相影响
  2. 线程问题很多,尤其是数据类问题
  3. M系统性能很低

在这里插入图片描述

有的放矢:重构只解决第1个问题

技巧3-合纵连横

要素

合纵

说服业务方和老板

以数据说话

把“可扩展性”转换为“版本开发速度很慢”,然后给出对应的项目数据

以案例说话

如果没有数据,就举极端案例,例如某个小功能,开发测试只需要1周,但是因为其他系统等原因,等了1个月才上线

连横

说服其他团队

换位思考

思考对其他团队的好处,才能让人配合

合作双赢

汇报和总结的时候,把其他团队也带上

案例

在这里插入图片描述

合纵:告诉产品经理和项目经理极端案例,设计2周、开发5天、1个月才能上线

连横:P业务线上问题大大减少,P业务不会被其他业务影响

技巧4-运筹帷幄

要素

问题分类

将问题分类,一段时间集中处理一类问题

避免对照Excel表格,一条一条的解决

问题排序

分类后排序,按照优先级顺序来落地

避免见缝插针式的安排重构任务

逐一攻破

每一类问题里面先易后难

把容易的问题解决掉,增强信心

架构重构的一些典型问题

架构重构是否可以引入新技术?—>可以,但尽量少,架构重构要求快准

业务不给时间重构怎么办?—>会哭的孩子有奶吃

其他团队不配合怎么办?—>学会利用上级力量

业务进度很紧,人力不够怎么办?—>收集需要重构的证据,技术汇报的时候有理有据

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

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

相关文章

Java8--Stream的各种用法(二):collect、Collectors

Collectors中的方法: 其中我们常用的是前三个:将流中的元素放到集合中、分组、toMap。 下面我们逐个介绍这些方法的使用. 基础类: Student public class Student {private Integer id;private String name;private String className;priva…

Linux21 --- 计算机网络基础概论(网络基本概念、网络分层模型、网络应用程序通信流程)

一、网络基本概念 1、网络 网络是由若干结点和连接这些结点的链路组成,网络中的结点可以是计算机,交换机、 路由器等设备。 网络设备有:交换机、路由器、集线器 传输介质有:双绞线、同轴电缆、光纤 下图是一个简单的网络示意图…

应急启动电源+充气一体式方案设计

汽车应急启动电源是为驾车出行的爱车人士和商务人士所开发出来的一款多功能便携式移动电源。它的特色功能是用于汽车亏电或者其他原因无法启动汽车的时候能启动汽车。同时将充气泵与应急电源、户外照明等功能结合起来,是户外出行必备的产品之一。 汽车应急启动电源应…

springboot源码编译报错Unable to start the daemon process

官方网址:GitHub - spring-projects/spring-boot: Spring Boot springboot版本: 报错截图: 报错代码: Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For examp…

jsp196ssm毕业设计选题管理系统hsg4361B6

本系统选用Windows作为服务器端的操作系统,开发语言选用Java,数据库选用Mysql,使用mybatis数据库连接技术,使用Myeclipse作为系统应用程序的开发工具,Web服务器选用Tomcat版本。 下面分别简单阐述一下这几个功能模块需…

pytest配置文件合集(一)-----------conftest.py应用

配置文件: 配置文件一般存在项目的根目录下,官方文档介绍了四种配置文件,每种文件有各自的用处。 pytest.ini:主配置文件,最常用,优先匹配配置项 tox.ini :可以理解为pytest.ini的另一种写法&…

接口测试方法论——WebSocket一点通

WebSocket是HTML5提供的一种能在单个TCP连接上进行全双工通信的协议。前面介绍过,HTTP是一种无状态、无连接、单向的应用层协议。 HTTP采用了请求/响应模型:通信请求只能由客户端发起,服务器负责对请求做出应答处理。但这会出现一个很严重的…

【Java集合】List接口常用方法及实现子类

文章目录List接口> List 接口的常用方法> List的三种遍历方式> List 排序练习※ ArrayList 使用注意事项※ ArrayList 底层结构※ Vector 底层结构※ LinkedList 底层结构 (双向链表和增删改查案例)> ArrayList 和 LinkedList 比较List接口 …

字节跳动岗位薪酬体系曝光,看完感叹:不服不行

曾经的互联网是PC的时代,随着智能手机的普及,移动互联网开始飞速崛起。而字节跳动抓住了这波机遇,2015年,字节跳动全面加码短视频,从那以后,抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…

postgresql源码学习(51)—— 提交日志CLOG 提交日志CLOG 原理 用途 管理函数

一、 CLOG是什么 CLOG(commit log)记录事务的最终状态。 物理上,是$PGDATA/pg_xact目录下的一些文件逻辑上,是一个数组,下标为事务id,值为事务最终状态1. 事务最终状态 clog.h中定义了4种事务状态 /** …

Android开发:Fragment中优雅使用ViewBinding【Java】

目录 前言 官网示例 封装 前言 ViewBinding可以帮助我们减少代码中的大部分findViewById,官网中提到了它的优点和缺点: Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险…

Kotlin小知识之高阶函数

文章目录高阶函数定义高阶函数函数类型高阶函数示例内联函数内联函数的作用内联函数的用法noinline与crossinline高阶函数 定义高阶函数 高阶函数和Lambda的关系是密不可分的.像接受Lambda参数的函数就可以称为具有函数式编程风格的API了当我们想要定义自己的函数式API那就得…

使用 Learner Lab - 使用 AWS Lambda 将图片写入 S3

使用 Learner Lab - 使用 AWS Lambda 将图片写入 S3 AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务,让学生可以在 100 USD的金额下,自行练习所要使用的 AWS 服务,以下使用 AWS Lambda 将图片写入 S3。 如何进入 Le…

Git源码(Linus 2005 年提交的最初版本)阅读笔记

Linus 发疯文学欣赏 Git 是 Linux 之父 Linus Torvalds 于2005年开发的用于帮助管理 Linux 内核开发的开源版本控制软件。 美好的一天从阅读 Linus 的发疯文学开始。 (1) Linus 教你学习 Git (2) Linus 评价 CVS (Concurrent Version System) (3) 独一无二的 Linus 调侃结束&a…

手把手教你写一个生成yapi接口代码Chrome 扩展插件

前言 公司想开发个公众号,想在公众号里做业务,也不是做小程序,但是以后也可能做小程序。emm,就是这么随意。所以就找个到了uniapp,说是可以开发一套代码,多平台运行。开发语法还是vue,感觉也没…

RabbitMQ消息队列——快速入门

目录 1、MQ介绍 1.1、什么是MQ? 1.2、MQ的能够解决的问题 1.2.1、削峰填谷 1.2.3、异步处理 1.3、MQ的选择 1.3.1、Kafka 1.3.2、ActiveMQ 1.3.3、RocketMQ 1.3.4、RabbitMQ 2、RabbitMQ的介绍 2.1、RabbitMQ的概述 2.2、AMQP 2.3、JMS 2.4、RabbitMQ…

关系抽取:传统:UniRel: Unified Representation and Interaction for Joint Relational

针对传统下的三元组抽取提出的一种方法,在NYT和webNLG数据集上,再次刷新榜单。 本来对这个结果不是很确定,但作者公布了源码,we can reformulate it . 很少在看到这种文章了吧。 Core idea 换了一种解释思路。 从entity-entity的…

ARM汇编之乘法指令

ARM汇编之乘法指令前言 首先,请问大家几个小小问题,你清楚: 乘法指令有哪些种类呢?ARM乘法指令具体的使用场景又有哪些? 今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的…

精准诊断,精确治疗,智芯传感ZXPA侵入式压力传感器为心血管疾病患者带来福音

近日,据联合国《世界人口展望2022》报告显示,地球人口已正式步入“80亿时代”!人口数量增加,从一个侧面反映了人类文明的进步。此外,随着人类预期寿命增加,加上生育率下降,将加剧全球人口老龄化…

基于模型的聚类和R语言中的高斯混合模型

介绍 四种最常见的聚类方法模型是层次聚类,k均值聚类,基于模型的聚类和基于密度的聚类 . 最近我们被客户要求撰写关于聚类的研究报告,包括一些图形和统计输出。 可以基于两个主要目标评估良好的聚类算法: 高组内相似性低组间相…