每日一题:为什么要进行系统拆分?

article/2025/10/3 0:58:42

640?wx_fmt=png

原文来自 GitHub 开源社区 Doocs,欢迎 Star 此项目,如果你有独到的见解,同样可以参与贡献此项目。

面试题

为什么要进行系统拆分?如何进行系统拆分?拆分后不用 dubbo 可以吗?
面试官心理分析

从这个问题开始就进行分布式系统环节了,现在出去面试分布式都成标配了,没有哪个公司不问问你分布式的事儿。你要是不会分布式的东西,简直这简历没法看,没人会让你去面试。

其实为啥会这样呢?这就是因为整个大行业技术发展的原因。

早些年,印象中在 2010 年初的时候,整个 IT 行业,很少有人谈分布式,更不用说微服务,虽然很多 BAT 等大型公司,因为系统的复杂性,很早就是分布式架构,大量的服务,只不过微服务大多基于自己搞的一套框架来实现而已。

但是确实,那个年代,大家很重视 ssh2,很多中小型公司几乎大部分都是玩儿 struts2、spring、hibernate,稍晚一些,才进入了 spring mvc、spring、mybatis 的组合。那个时候整个行业的技术水平就是那样,当年 oracle 很火,oracle 管理员很吃香,oracle 性能优化啥的都是 IT 男的大杀招啊。连大数据都没人提,当年 OCP、OCM 等认证培训机构,火的不行。

但是确实随着时代的发展,慢慢的,很多公司开始接受分布式系统架构了,这里面尤为对行业有至关重要影响的,是阿里的 dubbo,某种程度上而言,阿里在这里推动了行业技术的前进。

正是因为有阿里的 dubbo,很多中小型公司才可以基于 dubbo,来把系统拆分成很多的服务,每个人负责一个服务,大家的代码都没有冲突,服务可以自治,自己选用什么技术都可以,每次发布如果就改动一个服务那就上线一个服务好了,不用所有人一起联调,每次发布都是几十万行代码,甚至几百万行代码了。

直到今日,很高兴看到分布式系统都成行业面试标配了,任何一个普通的程序员都该掌握这个东西,其实这是行业的进步,也是所有 IT 码农的技术进步。所以既然分布式都成标配了,那么面试官当然会问了,因为很多公司现在都是分布式、微服务的架构,那面试官当然得考察考察你了。

面试题剖析
为什么要将系统进行拆分?

网上查查,答案极度零散和复杂,很琐碎,原因一大坨。但是我这里给大家直观的感受:

要是不拆分,一个大系统几十万行代码,20 个人维护一份代码,简直是悲剧啊。代码经常改着改着就冲突了,各种代码冲突和合并要处理,非常耗费时间;经常我改动了我的代码,你调用了我的,导致你的代码也得重新测试,麻烦的要死;然后每次发布都是几十万行代码的系统一起发布,大家得一起提心吊胆准备上线,几十万行代码的上线,可能每次上线都要做很多的检查,很多异常问题的处理,简直是又麻烦又痛苦;而且如果我现在打算把技术升级到最新的 spring 版本,还不行,因为这可能导致你的代码报错,我不敢随意乱改技术。

假设一个系统是 20 万行代码,其中 A 在里面改了 1000 行代码,但是此时发布的时候是这个 20 万行代码的大系统一块儿发布。就意味着 20 万上代码在线上就可能出现各种变化,20 个人,每个人都要紧张地等在电脑面前,上线之后,检查日志,看自己负责的那一块儿有没有什么问题。

A 就检查了自己负责的 1 万行代码对应的功能,确保 ok 就闪人了;结果不巧的是,A 上线的时候不小心修改了线上机器的某个配置,导致另外 B 和 C 负责的 2 万行代码对应的一些功能,出错了。

几十个人负责维护一个几十万行代码的单块应用,每次上线,准备几个礼拜,上线 -> 部署 -> 检查自己负责的功能。

拆分了以后,整个世界清爽了,几十万行代码的系统,拆分成 20 个服务,平均每个服务就 1~2 万行代码,每个服务部署到单独的机器上。20 个工程,20 个 git 代码仓库,20 个开发人员,每个人维护自己的那个服务就可以了,是自己独立的代码,跟别人没关系。再也没有代码冲突了,爽。每次就测试我自己的代码就可以了,爽。每次就发布我自己的一个小服务就可以了,爽。技术上想怎么升级就怎么升级,保持接口不变就可以了,真爽。

所以简单来说,一句话总结,如果是那种代码量多达几十万行的中大型项目,团队里有几十个人,那么如果不拆分系统,开发效率极其低下,问题很多。但是拆分系统之后,每个人就负责自己的一小部分就好了,可以随便玩儿随便弄。分布式系统拆分之后,可以大幅度提升复杂系统大型团队的开发效率。

但是同时,也要提醒的一点是,系统拆分成分布式系统之后,大量的分布式系统面临的问题也是接踵而来,所以后面的问题都是在围绕分布式系统带来的复杂技术挑战在说。

如何进行系统拆分?

这个问题说大可以很大,可以扯到领域驱动模型设计上去,说小了也很小,我不太想给大家太过于学术的说法,因为你也不可能背这个答案,过去了直接说吧。还是说的简单一点,大家自己到时候知道怎么回答就行了。

系统拆分为分布式系统,拆成多个服务,拆成微服务的架构,是需要拆很多轮的。并不是说上来一个架构师一次就给拆好了,而以后都不用拆。

第一轮;团队继续扩大,拆好的某个服务,刚开始是 1 个人维护 1 万行代码,后来业务系统越来越复杂,这个服务是 10 万行代码,5 个人;第二轮,1个服务 -> 5个服务,每个服务 2 万行代码,每人负责一个服务。

如果是多人维护一个服务,最理想的情况下,几十个人,1 个人负责 1 个或 2~3 个服务;某个服务工作量变大了,代码量越来越多,某个同学,负责一个服务,代码量变成了 10 万行了,他自己不堪重负,他现在一个人拆开,5 个服务,1 个人顶着,负责 5 个人,接着招人,2 个人,给那个同学带着,3 个人负责 5 个服务,其中 2 个人每个人负责 2 个服务,1 个人负责 1 个服务。

个人建议,一个服务的代码不要太多,1 万行左右,两三万撑死了吧。

大部分的系统,是要进行多轮拆分的,第一次拆分,可能就是将以前的多个模块该拆分开来了,比如说将电商系统拆分成订单系统、商品系统、采购系统、仓储系统、用户系统,等等吧。

但是后面可能每个系统又变得越来越复杂了,比如说采购系统里面又分成了供应商管理系统、采购单管理系统,订单系统又拆分成了购物车系统、价格系统、订单管理系统。

扯深了实在很深,所以这里先给大家举个例子,你自己感受一下,核心意思就是根据情况,先拆分一轮,后面如果系统更复杂了,可以继续分拆。你根据自己负责系统的例子,来考虑一下就好了。

拆分后不用 dubbo 可以吗?

当然可以了,大不了最次,就是各个系统之间,直接基于 spring mvc,就纯 http 接口互相通信呗,还能咋样。但是这个肯定是有问题的,因为 http 接口通信维护起来成本很高,你要考虑超时重试、负载均衡等等各种乱七八糟的问题,比如说你的订单系统调用商品系统,商品系统部署了 5 台机器,你怎么把请求均匀地甩给那 5 台机器?这不就是负载均衡?你要是都自己搞那是可以的,但是确实很痛苦。

所以 dubbo 说白了,是一种 rpc 框架,就是说本地就是进行接口调用,但是 dubbo 会代理这个调用请求,跟远程机器网络通信,给你处理掉负载均衡、服务实例上下线自动感知、超时重试等等乱七八糟的问题。那你就不用自己做了,用 dubbo 就可以了。


-END-
如果看到这里,说明你喜欢这篇文章,帮忙转发 一下吧,感谢。微信搜索「web_resource」,关注后即可获取每日一题的推送。

1.  
2.  
3.  
4.   
5.

640?wx_fmt=jpeg

在看   640?wx_fmt=jpeg

http://chatgpt.dhexx.cn/article/MZYcxsOE.shtml

相关文章

个人对系统拆分的理解

在本人现在的公司和本人工作过的上一家公司,本人有幸参与并实施了公司业务系统的架构拆分,现将之前的工作总结下。 1,为什么要进行系统拆分 首先我们需要想想,到底什么样的系统需要进行拆分?并不是所有的系统都需要进…

登录+注册界面的实现(代码)

先看效果图&#xff01; 话不多说&#xff0c;直接上代码&#xff01; //布局文件&#xff1a;activity_login.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android&qu…

简单WEB登录页面代码实现

longin.html&#xff1a;登录页面&#xff0c;此处action引用**/**类型的地址&#xff0c;JSP可以用${ pageContext.request.contextPath }/LS <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&qu…

编写简单的登陆页面

1.简单登录界面&#xff08;自己设置css样式&#xff09; 代码如下 <form id"loginForm" action"#" method"post" novalidate"novalidate"><div class"login_box"><div class"login_box_left"&g…

实现网页登录代码

python 一、前言 本文通过selenium工具实现工作所用网站的自动登录&#xff0c;下图为网站登录界面。 1、运行环境 操作系统&#xff1a;Windows10 python版本&#xff1a;python3.7 2、需要的python第三方库 1、selenium 安装&#xff1a; pip install selenium selen…

【html】【一个简单的用户登录页面代码】

结果 代码 <!DOCTYPE html> <html><head><title>用户登录.html</title><meta http-equiv"keywords" content"keyword1,keyword2,keyword3"><meta http-equiv"description" content"this is my pag…

html 【一个简单的用户登录页面代码】

效果图 <!DOCTYPE html> <html><head><title>用户登录.html</title><meta http-equiv"keywords" content"keyword1,keyword2,keyword3"><meta http-equiv"description" content"this is my page&…

简单登录页面html代码

【实例简介】 js/html基础示例&#xff1a;简单登录页面 【实例截图】 【核心代码】 文档&#xff1a;590m.com/f/25127180-496787472-732294&#xff08;访问密码&#xff1a;551685&#xff09; 以下内容无关&#xff1a; -------------------------------------------分…

登录界面源代码

拿走请三联&#xff0c;并注明出处&#xff01; 没有上传原背景图&#xff0c;使用的话需自己更改图片名称 可连接注册界面&#xff0c;和用户照片墙&#xff0c;此文只有登录界面代码&#xff0c;代码存在些许问题&#xff0c;望观看的大佬们多多指教&#xff01; <!DOC…

python实现网站的自动登录(selenium实现,带验证码识别)

python实现网站自动登录&#xff08;selenium实现&#xff0c;带验证码识别&#xff09; 一、前言 这是鄙人写的第一篇博客&#xff0c;旨在总结一下近期所学&#xff0c;本文通过selenium工具实现工作所用网站的自动登录&#xff0c;下图为网站登录界面。 1、运行环境 操作…

登录页面的代码

登录页面的代码 在把页面和数据库做好之后&#xff0c;我的登录页面只需要 用户名和密码 &#xff0c;所以代码比较简单。 先找到登录按钮&#xff0c;给一个点击事件&#xff0c;然后再获取他们的表单值&#xff0c;然后对用户名和密码进行判断&#xff0c;判断是否填写了资料…

核函数(多项式,高斯核)以及svm解决回归问题

文章目录 一、SVM最优化问题转换1、多项式核函数 二、高斯核函数1.引入库1、多项式特征2、高斯核函数升维举例3、高斯核函数超参数gamma 三、svm解决回归问题总结 一、SVM最优化问题转换 变换为数学上一个更好解的 在这个式子中有重要的一项Xi&#xff0c;Xj 两个样本的点乘…

高斯核-高斯模糊

大白话高斯模糊 以二维高斯为例&#xff0c;公式&#xff1a; 高斯模糊的原理,可以理解成每一个像素都取周边像素的加权平均值 以高斯分布取g矩阵的值得到的模糊方法即为高斯模糊 权重矩阵 假定中心点的坐标是&#xff08;0,0&#xff09;&#xff0c;那么距离它最近的8个点的…

数值实验-高斯核函数 python/matlab 实现

支持向量机 支持向量&#xff1a;支持平面把两类类别划分开的超平面的向量点机&#xff1a;一种算法SVM 是一种二分类模型线性可分支持向量机&#xff1a;通过硬间隔最大化&#xff0c;学习一个线性分类器线性支持向量机&#xff1a;通过软间隔最大化&#xff0c;学习一个线性…

CS131专题-2:高斯核、噪声、滤波

目录 1 高斯核 1.1 一维定义 1.2 二维定义 1.2.1 应用高斯核的过程 1.2.2 不同σ值的高斯核情况 1.2.3 不同核宽度情况 1.2.4 高斯核&#xff08;滤波&#xff09;特性 1.2.5 使用高斯核做平滑滤波相对箱式滤波的优点 2 噪声 和 滤波 2.1 椒盐噪声、脉冲噪声 2.1.1 …

python高斯核函数_机器学习:SVM(核函数、高斯核函数RBF)

一、核函数(Kernel Function) 1)格式 K(x, y):表示样本 x 和 y,添加多项式特征得到新的样本 x、y,K(x, y) 就是返回新的样本经过计算得到的值; 在 SVM 类型的算法 SVC() 中,K(x, y) 返回点乘:x . y 得到的值; 2)多项式核函数 业务问题:怎么分类非线性可分的样本…

高斯整数matlab,Matlab---自适应高斯核

MCNN提出了适用于高密度人群的自适应高斯核: 笔者所理解的自适应高斯核函数: %function:通过高斯核产生相应的密度矩阵 %parameter: im:输入图像,灰度图; points:标注的点[X Y],n*2的矩阵 function im_density = get_density_map_autogaussian(im,points) im_density =…

高斯核原理详解+生成高斯核的Python代码

要搞清楚高斯核的原理的话&#xff0c;把下面这篇博文认认真真看一遍就可以了&#xff0c;链接如下&#xff1a; https://blog.csdn.net/u013066730/article/details/123112159 下面是我认为值得注意和需要补充说明的几点&#xff1a; 1 为什么高斯滤波能够让图像实现模糊化&a…

C语言哈希表UT_hash的使用方法详解

由于C语言本身不存在哈希,因此&#xff0c;我们可以调用开源的第三方头文件&#xff0c;这只是一个头文件&#xff1a;uthash.h&#xff0c;使用时只需要在文件首部编写#include<uthash.h>即可。 uthash的使用 #include "uthash.h" struct my_struct {int id…

utxo 是什么

UTXO 代表 Unspent Transaction Output。 在比特币社区里&#xff0c;Transaction 被简称为 TX&#xff0c;所以上面这个短语缩写为 UTXO。一般会认为 UTXO 是比特币区块链设计当中的一部分&#xff0c;但事实上 UTXO 和区块链没有必然的联系&#xff0c;你可以完全照搬比特币区…