「面试题」介绍你做过最复杂的系统

经常有人会问:能介绍下你做过最复杂的系统吗?对此,你被人问起过吗,你思考过什么标准才算复杂吗?

系统的复杂性包括了技术复杂性和业务复杂性。

有人抱怨道:我做的系统一点都不复杂,你看我们数据量不大,用不上分库分表,业务也不复杂,单体系统就够了,什么负载均衡和集群也没有,流量也不大,高并发和分布式也没接触过。

何为技术复杂性,我上面提到的都算,随着业务的发展,我们的系统架构需要支持大数据和高并发,因此复杂的系统架构孕育而生,在数据库层面要考虑分库分表,读写分离,主备切换;

为了提高查询性能和单点问题,分布式缓存必不可少;

为了销峰限流和服务解耦,分布式消息中间件也要用上;

大促期间,为了保证稳定性,还要机器自动伸缩,服务降级、服务隔离、服务熔断、服务限流等都是常用套路。

此外,分布式还有分布式调度系统,分布式监控系统,分布式日志系统,分布式链路采集等等。事实上,所以系统都是分布式的,单点故障是无法忍受的。说到这里,你觉得这系统太复杂啦。对的,为了构建高可用,可伸缩的分布式系统确实复杂。

但是,技术架构只是技术复杂性的其中一块罢了。

试想,一个复杂的算法算不算技术复杂性呢?我觉得也算。一个好的算法,可以帮助我们解决很多复杂的业务问题。

这里,对于我们非算法工程师而言,如果能把业务问题转换成算法问题,我就可以把人工问题转换成智能化,那么我们的业务离商业智能又迈进的一大步。

说 AI 可能远啦,聊点近的,比如延迟队列的“时间环”算法,ZK的会话分桶算法,限流的令牌桶等,很多偏业务实战方面的落地也可以让我们做得事情充满含金量,换句话说,吹逼层次可以提高了好几个 Level 哈。技术复杂性,还可以是解决多数据源的聚合查询问题,解决数据多写同步以及一致性问题等。抛砖引玉,仅供参考。

业务的复杂性在于:不同业务与业务之前相互作用与干扰。

做过 2B 产品或者项目的小伙伴应该非常理解我所说的含义,因为适配不同企业和商家做定制化需求会导致产品越来越无法通用化,尤其 ERP 这种强业务定制的系统。

那么,为了维护多套类似的逻辑和代码是成本巨大的,因此设计可扩展性的系统尤为重要。很多时候,我们对需求的变化是不可预期的。这种不可预期性恰恰是业务复杂性所在。

事实上,架构设计都是基于当下的设计,一个设计的好坏在于:它是否可以快速地支持业务。换句话说,我设计的系统满足了当前的业务,但是它后期无法可扩展,那么这个设计是好是坏呢?此外,我们根据领域模型作出了良好的设计,但是随着业务的发展,每个模型耦合越来越重。

那么,请思考是领域模型不合理,还是架构设计的不合理,还是业务发展的太快了呢?或者,再思考一个问题。一个公司觉得业务中台的概念很好,也打算落地实践,但是呢,它的业务比较单薄,那么,此时它设计的业务中台具有通用性吗?我个人感觉,不太好说。

事实上,需要不停的业务滋养,只有滋养中才能从最初仅提供单薄业务功能的服务逐渐稳定成一个解决具体问题的业务领域模型。设计模式的有一个模式叫做「模版方法模式」,它的核心思路在于把公共的流程固化下来,把差异点移交给具体的业务方去实现。是吧,只有我们有足够多的业务场景,我们才能沉淀出那些是公共的逻辑,那些是可扩展点,然后在业务设计过程中,我们可以在本业务实现子类做自定义实现,或者提供 SPI 给业务介入方扩展。

总结一下,业务的复杂性在于:不同业务与业务之前相互作用与干扰,以及我们对需求的变化是不可预期性。

你以为我说到这里就结束了吗?当然,不是。我更多的是想引发你的思考以及我们思维的碰撞。例如,很多人抱怨自己是 CRUD 工程师。

我觉得这些人太小看自己的价值了。业务的价值和复杂往往不是 CRUD,而是业务背后的价值思考。线下的业务线上化,传统的东西在线化,那么它就具有结构化存储的能力,可以和其他数据协同,那么,它就有价值。

此外,你是不是可以把 CRUD 的流程自动化,本来一天搞定的东西,你1分钟就搞定了,然后在花59分钟来实现业务差异性。可以了吗,当然不行。你是不是可以把59分钟在压缩压缩,写一个框架,把多分支的问题通过策略模式+工厂模式搞定呀,固化流程通过模版方法模式搞定哈,然后观察者模式、适配器模式、代理模式、责任链模式、状态模式都可以用一用。事实上,很多设计模式是解决复杂业务场景的可扩展经验套路。

最后总结一下,系统的复杂性包括了技术复杂性和业务复杂性。我们一起畅聊,学习,成长,打破认知的局限性!!!

原文地址:https://blog.51cto.com/14230003/2434666

时间: 2024-07-30 06:40:10

「面试题」介绍你做过最复杂的系统的相关文章

城市更新「意愿征集」具体怎么做?——本人以实操多个项目的具体经验给大家做分享

佳兆业集团控股执行董事.总裁麦凡表示:城市更新第一件事是意愿征集:由此可见,意愿征集在计划申报阶段的重要性. 实操案例的分享重在细节,而不是泛泛而谈,城市更新的大政策是人人几乎都看得到,并学的会的,而如何推动项目往前.如何将抽象的文字转化为创新性的具体行动.如何将严谨的工作在面对诸多利益纷争时一气呵成?这就需要实战经验了(本文不对具体政策内容作宣讲,本文末尾处有原文附件下载. (一).政策依据意愿征集政策依据主要为<深圳市拆除重建类城市更新单元计划管理规定>(2019年版).<深圳市城市

一文教你实现「飞机大战」里战机的控制逻辑

? 纵版射击游戏是一种比较经典的游戏类型,从早期的红白机平台到如今的手机平台,一直都有非常经典的游戏作品.纵版射击游戏只需要控制飞行器躲避敌机和子弹并攻击敌机,玩法和操作都非常简单,因此很适合移动平台上的操作.曾经微信平台红极一时的「飞机大战」相信每个人都玩过,那么今天就来教大家如何实现游戏里战机的控制逻辑. 1.首先创建一个游戏场景 GameScene,在场景中添加游戏背景和今天的主角——战斗机: 2.接下来创建战斗机的控制脚本 GamePlane.js: 3.创建成功后就可以进行编辑了,战斗

【vuejs面试题】务必熟知的vuejs面试题「务必收藏」

如果能帮到你,点个赞吧,务必熟知的vuejs面试题「务必收藏」 vuejs 基础必备 1.active-class 是哪个组件的属性?嵌套路由怎么定义 (1).active-class 是 vue-router 模块的 router-link 组件的属性 (2).使用 children 定义嵌套路由 2.怎么定义 vue-router 的动态路由? 怎么获取传过来的值 在 router 目录下的 index.js 文件中,对 path 属性加上 /:id. 使用 router 对象的 param

做了「负载均衡」就可以随便加机器了吗?这三招来帮你!

本文长度为3056字,预计读完需1.1MB流量,建议阅读8分钟. 阅读目录 什么是Session丢失? nginx是如何来解决这个问题的? Session保持的其它方案 结语 这篇是<分布式关注点系列>中「负载均衡」相关的内容最后一发了,后续也会继续讲「高可用」相关的其它主题,主要是限流.降级.熔断之类的吧,具体还没定.文末先附上之前发过的高可用相关文章,供你再温故一下. 下面这个场景不知是否在你面前出现过. 开发Z哥对运维Y弟喊:“Y弟,现在系统好卡,刚上了一波活动,赶紧帮我加几台机器上去顶

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

「C语言」Windows+EclipseCDT下的C语言开发环境准备

之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Clion等IDE/编辑器搭建C语言开发环境,但也只是点到为止的介绍,对每一个开发环境的选择没有详细的步骤与过程: 这次借助C语言期末课程设计文档上介绍用Eclipse开发C语言的时机,逐步图文论证如何用Eclipse从安装到输出自己的第一个C语言Hello World: 欢迎探讨,欢迎互粉: 目录:

「知乎」上那些神回答

1.你收到的最雷的表白语是什么?做我女朋友行不行,行就行,不行我再想想办法.—— 知友:程冬冬 2.“晚来天欲雪,能饮一杯无”,怎么回复比较霸气?司机一行酒,亲人两行泪.—— 知友:鼓鼓 3.「滚床单」有哪些优雅的叫法?管鲍之交.—— 知友:匿名用户 4.为什么中国人这么喜欢拍古装片?科幻片面临的最大问题是,在未来时空还要不要党的领导?—— 知友:magasa 5.暧昧是什么?暧昧=爱日未日.—— 知友:苑小帅 6.女朋友和女性朋友有什么区别?中国人取名字有一个习惯:实际上缺什么,一定要在名字里

如何将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态加载框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余增加.项目新功能的添加,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,只能紧急发布补丁版本,强制用户进行更新.结果频繁的更新,反而容易降低用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式需要通过用户量最大的主项目进行引导下载并安装.怎么办?这

「速成应用」一键生成微信小程序平台 可视化制作开发无需代码

经历了频繁的更新迭代,小程序已经构建起了趋于完善的生态,与此同时,以「速成应用」为代表的小程序第三方开发平台也在推动着小程序市场的发展.为了更好地助力企业打造微信内电商生态闭环,实现线上线下引流,「速成应用」于近日进行了全功能的更新,通过对各类功能组件的优化,帮助企业实现商业模式的转型升级与营销突破. 「速成应用」根据商家反馈的问题,重点对小程序模块中的电商.外卖等功能进行优化升级,旨在帮助企业解决门店经营与小程序线上营销两大难题.在这次升级过程中同样也对辅助功能进行了优化.升级完成后,全线功能