没有服务化的复杂单块系统有哪些问题

221 阅读7分钟

几十个人开发一个复杂单块系统,问题在哪儿呢?

1、代码重复问题

但是这个时候就会出现一些问题了,首先第一个问题就是代码的复用性问题。

你看,人多了以后,可能相同的一些基础性的代码,每个业务都会自己重复的写。给你举个例子吧,订单中心是几个同学负责,商品中心是几个同学负责。比如说订单中心现在要查询商品的数据,但是现有的商品服务接口没有可以满足需求的接口。那么如果是项目阶段一里面,就5个人,大家坐一块儿,你说一句,人家就给你写好了。

问题是,现在20多个人啊,分成几个小team,交流协作是很困难的,你以为呢。你现在找人家给你写个接口,人家手头有活儿,得给你拖着,而且可能还不太愿意做这个东西,这个时候你绝对着急了,你作为一个订单中心,想,反正就一个库,表就在那儿,就啥大不了的,我直接写个SQL查出来我要的商品数据不就得了。

得,订单中心自己干了这个事儿,自己查商品了。

码农,习惯,宁愿自己干,也不愿意去沟通,找别人帮忙。

然后呢,要是WMS中心、会员中心,啥啥中心的,都干这事儿,会怎么样?全部乱套了,类似的商品查询的代码,将会出现在各个中心的DAO和Service里,重复代码到处都是。

重复代码,人越多,沟通成本越高,协作成本越高。码农,一般如果能自己干活儿,他就不会去找别人去干。20人+的团队,10人-的团队这个问题还好一些。20人+的团队,分成了四五个小团队,这四五个小团队,就会形成自己的小圈子,平时中午吃饭都是小圈子自己去的。小团队A里面的一个人,小团队B里面的一个人,关系可能不会太好,中国的码农,性格特点。尤其你找别人说个事儿,帮个忙, 都不太方便,人家如果让你等,你就不耐烦了,SQL,接口不要了。

绝对会出现一大堆的重复代码。

2、多人协作效率问题

你看看,20多个人,一起改动一个10万+行代码的系统,不断的快速的在里面添加代码。最后会有哪些问题,咱们来想一下。从源头开始。

你说所有人都在一个工程里编码,common。然后大量的修改代码,说不定改着改着就串到别人那儿去改一下了,而且有些公共的基础代码,可能所有人都会胡乱修改,谁都保证呢,是不是。然后在提交代码merge的时候,绝对是大量的冲突,这个想都不用想。

超过5个人修改一份代码,冲突就很常见了,修复代码冲突的时候,一般要好几个人坐在一块儿,看着那个代码,仔仔细细的解决冲突。

大块的系统,商品中心,订单中心

接着不就是集成测试、QA测试了么,这个时候你的代码依赖了别人的代码,有没有想过一个问题,部署测试环境的时候,都是有一整套部署步骤的,可能别人的代码依赖了MQ、Redis,甚至是Cassandra等乱七八糟的基础设施,你可能都不懂那些东西。

那么问题来了,你就修改了你负责的比如一个商品中心,一小块代码,然后你把一个大块头的单块系统部署到了测试环境,结果人家的模块依赖了cassandra,kafka,因为一些环境的原因,报错了,或者出了问题,哪儿哪儿卡住了,启动不了,这个时候怎么办?

也许人家的模块每次部署之前都要先跑个脚本初始化一下数据,你嫩,压根儿不知道这事儿。所以胡乱部署,结果测试环境的系统启都启动不了。你就得找其他的很多人,过来看,系统启动不了。

完了到部署上线的时候,更是这样了,可能人家的模块每次上线之前,都要做点什么操作,比如说检查个日志,观察个监控啥的。结果呢,你们这个大个子的单块系统,你就修改了商品中心里面的一点点代码,然后楞是给部署上线了,完了你的模块倒是正常了,人家的模块呢?也许日志都是异常的!结果你根本都不知道,以为没事儿,喜滋滋回家睡觉了

所以说,一个大型复杂的系统,依赖的东西特别特别多,可能还会依赖本地的磁盘目录什么的,还有各种基础组件,你要是自己修改了里面一点点东西,然后自己部署,就可能出问题,测试环境和生产环境都是。你要是拉上一堆人,陪你上线,你不觉得很尴尬吗?人家都没修改代码,结果上线楞是要陪着你,浪费时间,人效极其低。

这就是大团队多人协作开发一个复杂单块系统的问题,我们都经历过,所以实在是太痛苦了,感觉非常的不合适。

3、扩容问题

完了呢,后面你要是系统要扩容,更加麻烦。本身你就是可能比如订单中心、商品中心,少数几个中心访问量特别高,所以要扩容加机器,然后什么采购中心、WMS中心是不需要扩容的。结果因为大家绑一块儿了,你要扩一块儿扩,这真是。。。。

人家的中心不需要扩容,你楞是给人家扩容了,浪费资源

而且你以为扩容那么容易?万一人家某个中心的代码,是有状态的,在内存里保存了一些状态呢,你扩容咋扩?可能都没法扩容,你还瞎扩。。。。到时候不就bug了?

单块系统,部署了一台机器,内存里维护每个用户的访问次数

扩容,2台机器,同一个用户的请求可能会打到不同的机器上去,可能就会出现,一台机器统计了用户A的访问次数是5次,另外一台机器统计了用户A的访问次数是3次。其实如果是在一台机器上的话,应该统计出来的是用户A的访问次数是8次。

我们几个系统耦合在一起,扩容的时候,别的系统保存了内存级别的状态,一旦扩容了多台机器,就会导致代码出bug。

4、可用性问题

大量的代码耦合在一起,任何一个中心的代码出点问题,给你举个例子,比如说采购中心如此无关紧要的模块,有个新来的应届生,乱写代码,写了个死循环。好了,完了,直接把所有机器的cpu打满,所有机器hang死,我们还真遇到过这事儿,惨不忍睹啊。。。。

100%

所有的14个中心代码在一起,一起部署的,采购中心处一个死循环,直接所有机器的cpu 100%,整套系统都跑不动了

客服中心的代码,出了oom,jvm死了,整套系统宕机