精选

【技术】研发工程师如何用架构师视角回答架构设计方案?

大家好,我是贺同学,今天来和大家继续聊一聊后端面试:如何用架构师的视角进行技术面试。


上一篇《三个技术锦囊,祝你提升面试成功率》:https://t.zsxq.com/0fmfDMWnx


无论是参加校招/社招面试时,相信不少人会被问到这样的问题:“你之前是如何设计这个系统(或子系统/模块/功能)的?请介绍你的思路。”


很多研发同学在听到类似的面试题时,往往忽略“系统设计思路”关键词,而是陷入某个技术点细节里,让面试官听得一头雾水。


这样即使你的技术再好,面试官也很难给你打高分,更可能认为你的设计能力不足,没有全局思维。


而要想答得更好,你要用架构师的视角回答,即从全局技术视角阐述设计的过程。


接下来我会通过一个案例,讲解如何从全局技术视角介绍自己的技术方案。


案例背景


在常见的电商系统中,当用户发表一条商品评论,后台的逻辑是点评系统会调用一系列的远程 API 接口,如调用风控系统、广告系统、消息系统……几个甚至十几个系统的接口。


在业务建设之初,考虑到快速开发与上线,商品评论发布是通过同步 RPC(Remote Procedure Call,远程过程调用)远程调用各系统接口完成的。这种方式在系统少、逻辑简单的阶段很符合实际情况的设计。


但随着业务快速发展,通过 RPC 同步调用的问题逐渐暴露出来。由于过多地依赖其他系统,导致评论发布的接口性能很低,可用性也容易受到其他系统影响。而且每当点评系统需求上线时,其他系统都需要跟着进行联调测试,导致需求迭代速度缓慢。


在做系统架构升级改造时,如果你有互联网设计理念,会很容易想到问题在于系统间的耦合度太高。解决办法就是采用异步化解耦,从而通过引入 MQ 消息管道,在架构上进行系统业务逻辑拆分,将原本强依赖的系统间的同步 RPC 调用变成异步消息触发


案例分析


对于上面的案例,假设你是应聘者,当被问“如何做这个点评系统的改造?”时,你会怎么回答?你会不会直截了当地说“我引入了 MQ 消息队列,做了系统解耦,采用异步消息通知的方式来触发系统调用”呢?


在互联网系统设计方案如此透明的今天,随便在网上搜一下都会有大量类似的解决方案。以上回答不但不会让面试官满意,甚至有可能令人怀疑你的项目经历的真实性。


作为研发工程师,正确的回答方式是要让面试官知道你解决问题的思维。相比一上来就说用了什么技术,阐述解决思维更能证明你的能力,因为解决技术问题的方法有很多,这是“术”,但解决技术问题的底层思维逻辑是一样的,这是“道”。


面对此类问题,结合之前的经验和学习,给大家总结了如下四个层面的答案:


1、谈复杂来源;

2、谈解决方案;

3、谈评估标准;

4、说技术实现。


复杂来源


之所以要先分析系统的复杂度,是因为只有正确分析后才能明确设计原则,进而设计架构方案,整体项目才不会找错方向。


如果一个系统本来因业务逻辑复杂导致功能耦合严重,你却设计了一个 TPS(Transactions Per Second,每秒事务处理量)达到 10000/秒 的高性能架构,那么即使架构性能再优秀,也没有现实意义,因为技术设计没有解决主要问题的复杂度。这是很多研发工程师的通病,设计偏离了方向,只是为了设计而设计。


那么如何正确评估系统的复杂度呢? 互联网软件通常分为功能性的复杂度和非功能性的复杂度两种。


复杂度评估


从功能性复杂度方面来看,你可以从案例中得知,产品业务发展快速、系统越来越多、协作效率越来越低。作为系统负责人,你敏锐地发现问题根源在架构上各业务子系统强耦合。于是你引入消息队列解耦各系统,这是系统业务领域带来的本质上的复杂度,也就是功能性的复杂度,解决的是系统效率的问题。


此外,对于互联网系统设计,还需要考虑非功能性的复杂度,例如高性能、高可用和扩展性等的复杂度的设计。


对于点评系统来说,还需要考虑高可用的问题。假设点评系统的消息队列挂掉,将导致用户评论发送失败,高可用性是点评系统的设计复杂度之一,包括点评写入、点评存储,以及点评消息的读取,都需要保证高可用性。


为了方便理解非功能性的复杂度,我只分析了“高性能”和“高可用”这两点,在实际应用中,不同的公司或者团队可能还有其他方面的复杂度分析。例如有的公司会考虑安全性,有的公司会考虑成本等。


所以综合分析来看,点评系统改造的复杂度来源于两点。


●功能性复杂度:要解决业务发展带来的系统耦合、开发效率缓慢问题。

●非功能性复杂度:要保证系统的高可用性。



解决方案


在确定了系统面临的主要复杂度问题后,就有了明确的方案设计目标,这时就可以开始进行架构方案设计了。我同样会结合本文的案例场景,谈谈点评系统消息管道的架构设计解决方案。


1、采用开源的 MQ 消息管道。目前 MQ 消息管道有很多开源解决方案,比如 Kafka、RocketMQ、RabbitMQ 等。在实际项目中,你可以根据不同的应用场景选择合适的成熟开源消息队列方案,这是很多公司常用的做法。


2、采用开源的 Redis 实现消息队列。方案 1 虽然应用了开源 MQ 实现点评消息的通信,但是因为引入一个消息中间件就会带来运维成本,所以方案 2 可以基于轻量级的 Redis 实现,以降低系统的维护成本和实现复杂度。


3、采用内存队列 + MySQL 来实现。方案 2 中虽然应用了较为轻量级的 Redis 来实现,但是还需要引入一个缓存系统,同样也会带来运维成本,所以方案 3 是直接基于 MySQL 实现,即基于内存队列的方式,异步持久化到数据库,然后通过定时任务读取 MySQL 中的消息并处理。


一般情况,你至少要设计两到三套备选方案,考虑通过不同的技术方式来解决问题。方案设计不用过于详细,而是要确定技术的可行性和优缺点。


评估标准


设计完三套解决方案之后,摆在眼前的问题就是需要选择最合适的一个。这就需要一套评估标准了。


在互联网软件架构中,架构师常常会把一些通用的设计原则写到设计文档中,比如设计松耦合、系统可监控等,做系统架构,需要站在更高的层面考虑系统的全局性关注点。


比如性能、可用性、IT 成本、投入资源、实现复杂度、安全性、后续扩展性等。这在不同场景的不同阶段会起到决定性作用。


那么针对案例中的点评系统来说,要如何评估方案呢?这要从点评系统的复杂度来源进行评估。


点评系统功能性复杂度

点评系统的功能性复杂度问题,本质上是随着业务发展带来的系统开发效率问题。解决这个问题要试着站得更高一些,以部门负责人的视角,考虑现有研发团队的能力素质、IT 成本、资源投入周期等因素是否匹配上面三种架构解决方案。


点评系统非功能性复杂度

为了解决系统的高可用,可以参考三个设计原则。


第一个是系统无单点原则。首先要保证系统各节点在部署的时候至少是冗余的,没有单点。很显然三种设计方案都支持无单点部署方式,都可以做到高可用。


第二个是可水平扩展原则。对于水平扩展,MQ 和 Redis 都具有先天的优势,但内存队列 + MySQL 的方式则需要做分库分表的开发改造,并且还要根据业务提前考虑未来的容量预估。


第三个是可降级原则。降级处理是当系统出现故障的时候,为了系统的可用性,选择有损的或者兜底的方式提供服务。


常用手段主要有三种。

限流,即抛弃超出预估流量外的用户。

降级,即抛弃部分不重要的功能,让系统提供有损服务,以确保核心功能不受影响。

熔断,即抛弃对故障系统的调用。一般情况下熔断会伴随着降级处理,比如展示兜底数据。


针对案例场景中三个解决方案的降级策略,在一般的情况下,我们默认数据库是不可降级的,MQ 和 Redis 都可以通过降级到数据库的方式做容灾处理。所以案例中的三个解决方案,MQ 和 Redis 要考虑降级到 MySQL 或其他方式,这里就还需要根据情况投入降级的开发成本。


通常来说,方案没有优劣之分,而是要看哪个更适合当下的问题,只要架构满足一定时期内的业务发展就可以。

你要知道,作为技术人,考虑问题的方式要比具体的选型结果更为重要,这是面试的加分点。


技术实现


在确定了具体的架构解决方案之后,需要进一步说明技术上的落地实现方式和深层原理,如果你最终选择基于 Redis 来实现消息队列,那么可以有几种实现方式?各自的优缺点有哪些?对于这些问题,要做到心里有数。比如,基于 Redis List 的 LPUSH 和 RPOP 的实现方式、基于 Redis 的订阅或发布模式,或者基于 Redis 的有序集合(Sorted Set)的实现方式,你可以自行搜索,不在展开。



总结


最后,我把今天分享的的“四步回答法”做个总结,加深每一步你需要掌握的注意点。


  1. 在回答系统复杂度来源的时候,要注意结合具体的业务场景和业务发展阶段来阐述。
  2. 在回答解决方案的时候,有价值的解决方案一定是建立在明确复杂度来源基础之上的。所以在设计架构的时候才分主要问题和次要问题,主要问题是必须要解决的点,次要问题可以根据实际情况进行取舍。
  3. 在回答如何评估架构方案时,至少要从功能性和非功能性两个角度出发判断方案的合理性。
  4. 在技术实现的细节上,要尽量讲出技术的实现原理,不要浮于表面的框架组合。


到这里,我们已经知道了如何用架构师的视角进行技术面试,其实简单一句话,所谓的架构师视角就是全局的视角,这里的全局包括空间全局和时间全局,在空间全局上你要看到整个系统的领域边界,在时间全局上你要看到整个系统的发展周期。


全文完,如果觉得有帮助或启发,欢迎点赞留言~❤️


#后端 #职场


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
#资源# #分享# 微信读书 得到电子书会员能覆盖很多书,找不到的,可以看下下面两个网站 https://zh.z-library.se/ https://zh.annas-archive.org/
22
#资源,好久没有在星球里给大家分享了,最近半年在忙自己的一个大事情,没怎么冒泡(无辜脸.jpg),趁五一假期的小尾巴,给大家分享一个很牛的知识库网站,包括编程语言、算法与软件架构、Web 与大前端、服务端开发、运维与高可用、云与分布式基础架构、人工智能与深度学习等等。 看界面还有完整的技术 & 产品 & 商业知识体系等知识,大家可以收藏学起来! https://ng-tech.icu/ #分享# #经验#
46
#职场# #经验# 隔壁星球小伙伴分享的,觉得写得不错,在分享一下给大家 《对职场的十点建议》 假如您的孩子大学毕业,初入社会,只允许您传授10条经验给他,您会说什么?对于很多像我一样农村出来的穷二代,父母面朝黄士背朝天供养我上大学和维持基本的生活已经拼尽全力,很多经验都需要自己付出实际的代价去获取,太昂贵。没有高人指点,自己悟性又一般,希望您能不音赐教。谢谢您的时间 排序不分先后。 第一是要用心。做什么事情都要用心。同样做一件事情,花不花心思,结果差很多。要么不做,要做就用心做好 第二要受得了委屈。工作不是在家里。想干就干,不想干就不干。稍微被说几句就服负气的玻璃心的人不适合工作,还是在家里呆着吧应该也没有什么成就 第三勤奋。天赋都差不多的情况下。比的就是谁更勤奋更努力。整体而言勤奋努力的运气就会更好一点。 第四就是,做杂事。下闲子,有用没用的事情都做做,整天只做有用的事情。也会错过那些现在看没什么用,但以后可能会很有用的事。 第五就是。多见人,什么人都聊聊,见见。机会更多。别一个人呆自己的世界里闷着,总拿自己的世界观去看这个世界。眼界只会越来越小 第六就是学会扛责任,遇到事情别推责任,错了就是错了,别找理由借口。 第七,别耍小聪明,耍滑头,一眼就看出来的聪明都是小聪明,挑肥拣瘦,偷工减料,损公肥私都是小聪明。时间久了,谁是谁,大多数人都一清二楚,没必要装。 第八,!学会辨别好人坏人,然后选择跟好人一起,离开坏人。所谓好坏未必是违法乱纪更多是没责任心,喜欢蹭你便宜,出了事,责任都推给你,好处都自己占的人,有这种领导赶紧离开 第九,尽量选择自己喜欢的行业,每天问问自己,喜欢什么擅长什么,把自己的长处做到极致,扬长避短能事半功倍 第十,做个好人,做个对世界抱有善意的人积极乐观的看待世界。这个世界永远都会存在各种问题,无论你悲观还是绝望,都依然存在乐观,悲观都改变不了世界,但是乐观能让你走的更远。悲观只会被抛弃。别做悲观的人也远离悲观的人。(校长语)
40
职场分享:PDCA 模型
37
#经验# #职场# 《混大厂,如何找到自己的生态位》 这两天前老板来深圳出差,一起吃了饭聊聊天,聊到一个话题,职场生态位, 大家也知道,现在大厂晋升也是越来越卷了,一方面是组织架构庞大,在降本增效的大目标下每个人要多做更多的活,但其实同质化也很严重,另一个方面,晋升考核越来越严格 职场生态位:指自己在职场生态当中所占据的位置,尤其是为关键岗位提供核心价值的位置。只有抢占了职场生态位,我们的地位才会最稳固,职位晋升才能最快,个人能力获得最大的提高。当然了,也能轻而易举地收获最多的Money。 在团队里面,你能解决问题,提供成果,或者能提供通往业务目标的方向/方法/捷径,替别人替组织赢得一个生存空间,在生态位上有自己的护城河,你就占据很大的优势。 举个例子,我们常见的,酒店前台,外卖小哥、快递员等等这类靠出卖苦力,没有特别技术含量的职位,就处于职场生态位的比较低端的位置,而且随时有被取代的可能。 而工程师、医生、律师、财务、高级管理人才等技术工种,这些随着经验积累,越来越值钱的职业,就处于职场上比较高端的生态位。 当然这里没有任何歧视岗位的意思,只是做一个对比,毕竟,几十年的工作经验很难被取代。 如果你已经在职场上抢占了不错的生态位,那么恭喜,把眼下工作好好做,就能提交一份满意的人生成绩单 微信公众号平台 18 年以后新注册的默认都没有留言功能,其实类比任何行业,早就是优势,比如社群,平台,人脉链接,早点抓住机会,抓住生态位,抱住大佬,靠近大佬,早点付费进群,抓住身边大佬的生态位,就比晚来的人占据极大的优势 那么,普通人如何找到自己的生态位? 《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=精进3》的作者采铜老师说:找到生态位很难,创造生态位却很简单。关键点只有三个字:被需要。  这个点怎么理解,比如说我们组的例子,因为最早和我同级的一个小伙伴呢,他来的最早,他可能大二就开始来这边实习了。 就现在他基本上在组里面工作时间最长的,而且对整个我们这趟业务刚做起来的时候,他是最原始的几个人之一,所以说他现在对整个业务的这个了解熟悉程度,上下游链路,包括和其他团队合作模式都比我们后来的人都要清楚,那么他就能做一个小组长的管理,有带人的经验,这样晋升机会就比别人大很多。 那么说回来,如果说你在一个新团队里面,可能是后面来的人,或者说刚加入不久的。那么如果你要找到自己的生态位的话,有几个建议 首先第一个就是说在这个团队中,你要找到自己熟悉的项目,或者感兴趣的项目,或者说要抢到一个很好的活,然后在这个周期中把这个活做好,做得出色,让领导满意,而且是被领导所关心的问题,把领导关心的问题解决好,自然而然领导就关注到你,机会就多了 另外一个你要就是跟一些合作方去聊,或者说一些历史的一些遗留问题去梳理啊,找到一些解决方案,然后呢把这个事一步步推进去,做一些优化之类的,能够改善我们现在已有系统的性能,这个你也可以做一个就是前期的一个技术积累,去做一个优化的一个方向积累,这样也能形成自己的壁垒。 另外还有就是除了把工作做好,如何把工作成果汇报的好也是一个技能,反正在互联网公司混,能力是一方面,让别人如何看到你的能力,展示出来也是很重要的事情。 先聊这么多,大家加油💪
25
下载 APP