Published on

微服务与单体架构

Authors

模拟一个架构师面试的场景

Q:(面试官):请介绍一下微服务优点,缺点

A:(求职者):优点:解耦降低系统复杂性;不同服务可以使用不同技术栈;根据访问量灵活扩容缩容;故障隔离;开发迭代更快。缺点:实现复杂(分布式事务,错误重试等引起的),运维复杂

Q:解耦有什么好处?

A:合理划定服务边界后,一个服务不用深入了解整个系统的逻辑,只需要管自己的业务逻辑。需要了解的信息限定在当前服务中,避免和整个系统的研发进行沟通,极大的提高沟通相率。如果不将一个大系统拆分成若干服务。几百几千个研发光开会,协调事项就占据了所有的工作时时间。。。。。 还不一定能沟通到位。。。。大事化小,小事化了。这就是微服务解耦的最大好处。

Q:引入微服务后,还要处理分布式事务等,明明代码量增加,复杂度增高了,为啥开发迭代还更快?

A:前面说了极大的减少了沟通,这一点提升迭代速度的主要原因。另外还有,不同的微服务使用不同的Git仓库,减少了代码冲突可能性,减少编译时间,减少了回归测试的范围。甚至系统启动速度,一个大系统全部启动起来可能就要几分钟甚至数十分钟,开发改一行代码,要等半天系统才能启动起来看效果。

Q:如果我采取巨石架构(Monolith),但是我分模块,像划分微服务一样划分模块。模块之间只能调用暴露的API(Interfaces),模块之间只允许API交付。是不是也能实现解耦?每个模块单独建一个Git厂库;测试的时候像微服务一样,mock掉外部模块的API;我也可以稍微做点手脚,让我的单个模块也可以独立启动来进行调试。 你看,这样的巨石架构,是不是也能解决你前面说的问题?而且我还没有分布式事务这个大麻烦。

A:这,好像也对。。。。

A:你不能故障隔离!(抓头发)

Q:故障分两种,一种是功能不正常,但是不影响其它功能。 比如保NullPointerException。一种是会影响其它功能的故障,比如OutOfMemoryError。NPE这种,微服务和巨石应用表现一样。内存爆了这个问题,巨石应用同样可以启动多个节点,不可能所有节点同时内存爆掉。我有服务监控,某个节点爆了自动重启,也不影响整个系统可用性。甚至我还可以让不同的节点内存大小有些差异,尽量让他们不同时爆掉。爆CPU同理。

A:这。。。。(抓头发)你不能灵活地扩容缩容一个模块。

Q:我为什么要扩容缩容某一个模块? 我根本就不用关注哪个模块内存占的多,哪个cpu占的多,哪个网络带宽占的多。我只要无脑增加节点,让每个节点cpu、内存配置合理,不浪费即可。这反而是优点,不是缺点。

A:这。。。。(抓头发)你不能使用不同的技术栈!你总不会考虑使用Java来写机器学习吧?

Q:如果可能,整个公司的技术栈尽量统一是好事。但是,确实也需要不同的技术栈。但是,我用SOA也行啊,面向服务但是不用搞那么微麻。

A:这。。。。(抓头发)大家都这么用,不可能大家都错了吧? 能请教一下面试官,为啥没有明显的好处,大家还要用微服务呢?

Q:这。。。(抓头发) 刚才说的模块隔离,隔离得不彻底。现在大环境都是向上管理,一般系统设计实现都是无证程序员在搞,再加上产品经理天天改需求,老板天天吹上线,项目经理天天喊加班。大家都争先恐后的往前跑,业务功能实现了就好。deadline到了交不出货谁都没有好果子吃,怎么快怎么来。加班加着加着,可能就有不少人有意无意的不管啥隔离解耦了。。我猜测,可能是996让微服务这种物理隔离变成最佳实践了吧。微服务成功不是因为技术限制,是因为996?

A:知乎有人问,微服务为啥突然就不火了,你怎么看?

Q:谁说的不火了,如果去卖个系统,不是微服务架构,售前都不好意思出门。如果使用微服务,甲方都愿意多出三五十万。不过,确实越来越多的人开始审视微服务了。微服务最大的挑战不是啥分布式事务,错误重试,复杂运维等问题。这些技术问题,大佬们早就搞出了若干最佳实践。什么BASE,什么EDA,什么kubernetes等等。

微服务最大的挑战,在于微服务的边界划分。如果划分得有问题,微服务之间互相耦合在一起。没了解耦带来的好处,反而有微服务和巨石应用共同的缺点!

另外,有好多架构师都是向上管理的PPT架构师,他们真的搞清楚了最佳实践是什么吗?好多架构师都是指点江山,从来都是只吹NB,不做设计。然而无证程序员搞的意大利面设计,让分布式系统(微服务)变成了分布式单体应用(分布式巨石应用)。

微服务最大的作用是:服务拆分解决了大团队的沟通协作噩梦。但是中小团队,本来就只有三五十杆抢,甚至三五杆抢,哪有啥沟通协调问题。

算了,你看就这几竿抢,还都是培训学校出来的,我们还是不搞高大上的微服务了。不要给我说什么设计模式,不要给我说什么架构,老板只管功能上线。老夫写代码从来都是复制粘贴,不论产品经理怎么改需求,老夫都能在第二天上线!

根据https://www.zhihu.com/question/600277145/answer/3054381993整理

模块化单体架构