看完这篇《系统设计题目的回答要领》,下次换你拷打面试官

文章主体来自@程序员程序员。该同学目前已经入职美团银行卡支付业务。后续也会在牛客更新自己的工作经验和面经。感兴趣的同学可以关注一下他。

一句话铭记在心:

这种题一定要学会反问面试官,索取更多的信息。

系统设计题想要考察什么?

系统设计题不是让你设计一个完美的系统出来,面试官也不可能考虑的面面俱到,因此你不要有太大的心里压力。考察这种题,主要还是考察一下三方面:

  1. 沟通表达能力:面试官不可能一句话描述清楚这个系统,我们需要跟面试官交流去完善细节。比如他想让我们主要设计哪些功能、系统的流量是多少、系统的用户量大概是多少。在这个阶段就把面试官当场产品经理即可,正常的面试他不会嫌弃你问的多,理想的过程就是在他一点点提示中你把系统设计的比较完备。

在面试的时候,不要一个人闷着头想,最后吐出来一个自以为完美的架构。这种大多数在面试官看来就是憋了半天之后拉了一泡大的。

所以要一遍表达自己的思路,一遍不断的完善。要让面试官了解你的一整个思路历程,不要让面试官尴尬的等你。

  1. 知识广度和深度:因为设计的业务场景非常多,所以对知识广度有很大的要求,比如设计一个红包雨系统、直播系统、弹幕系统。如果你之前没有相关的技术积累的话很难无中生有相关的概念,因此这部分需要我们着重积累。无论是中间件的积累,还是技术架构的积累都是很有必要的。

在这里给大家推荐三个比较万金油的中间件:

1.京东HotKey:这个中间件的作用是检测Redis中的HotKey。当检测到Hotkey后,这中间件可以直接把对应kv推送到线上服务中。这样下次请求就不需要访问redis了,而是直接从自己的JVM中获取。

2.美团BCP:这是一个一致性校验工具。场景很常见,比如我们需要校验两个数据库的数据是否一致。例如我们可能会有一条数据链路是先同步MySQL,再写es。那如何确保这条数据一定存在于MySQL和es中呢?就要使用这种一致性校验工具了。

3.databus:数据库变更捕捉工具。他会伪装成为数据库的一个slave节点,以此来拉去主库的binlog日志。可以根据binlog日志来往下游数据库中同步数据。

  1. 技术和业务的取舍:我们不可能按照技术最优的路线去设计,这时候要求我们向业务进行一定的妥协,比如我们需要为了高并发舍弃数据强一致、为了性能舍弃安全性,你只需要在这部分表现出你的业务思考即可。

技术在大多数情况下是为了业务服务的。所以不存在最优的技术,只有和业务高度匹配的技术。我举一个例子:比如哔哩哔哩的漫展卖票

在这个业务下,票超售了能咋?那玩意又不是一个人一个座位那种。漫展场馆内多塞几个人无所谓。所以这个业务场景有必要使用分布式事务吗?

分布式事务会大幅度的拖垮线上服务的性能,在这个场景下都不如使用实时核对消费+最大努力通知+逆向数据补偿。

我们回答的方向是什么?

系统设计题一般是设计一个C端产品,因此最重要的有三点:

第一是要完成面试官要求的核心功能

第二是系统要保证高并发下的访问速度

第三是合理设置存储方案。

我们的设计就是往三高上靠即可:高性能、高可靠、高可用。

我总结的这套思考方式将回答总结成3+1。3代表按照接入层、逻辑层、存储层的顺序递进思考;1代表需要完成的核心业务功能。

我将通用的这部分划分为以下几个层级。

1.接入层:负责流量的分发,如果面试官提到了百万QPS,不用想,我们肯定要在这里跟他吹一下你所了解的负载均衡工具,比如nginx、lvs、f5等。这和海量数据题利用了相同的思路就是分治。

2.逻辑层:在这里我们要完成核心业务功能。需要考虑引入什么中间件、什么缓存架构等。这一部分负责处理拆分后的流量。常见的思路有MQ异步解耦、本地-Redis-数据库多级缓存、CDN加速等。

3.数据存储层:我们需要考虑百万级别QPS的存储问题,这里一定是分布式的数据库,可以考虑分库分表、对于对象存储可以考虑元信息和内容信息的分离、冷热数据分离、备份等。

4.核心业务功能:给出设计方案并进行设计方案的对比

比如设计红包雨这个功能核心功能就是红包拆分,我们通过积累知道有一些俩种方式。

优缺点分析:二倍均值法实现简单,空间复杂度低,但是用户间抢到的金额不会有太大差距,因此给用户的惊喜较少。线段分割法实现复杂,但是金额差距大,娱乐性更强。

举个例子:设计一个百万级TPS的红包系统

1.接入层(网络负载层):搭建多个数据中心,并通过负载均衡工具比如nginx、lvs、f5(处理量分别是万级、十万级、百万级)对流量进行分散,不同数据中心只承载一部分流量。如果需要用到redis(这种级别的服务几乎强依赖于redis),拆分后的流量按照单机redis能处理8wtps的能力组建redis集群。

2.逻辑层:将红包拆分,并使用redis的list进行保存(key为红包id,list是拆分的金额),抢红包就是使用lua脚本pop这个list,并将结果存到用户维度的队列(key为uid+红包id,红包金额)。定时任务定时拉取用户队列进行批量入库操作,并发送mq通知结果。

3.存储层:mysql集群按照uid维度进行分库,存储用户已经抢到的红包列表。近期数据存MySQL,历史数据迁移至HBase,结合时间分表(如按月分表)控制单表规模

4.核心业务功能:

比如设计红包雨这个功能核心功能就是红包拆分,我们通过积累知道有一些俩种方式。

  1. 二倍均值法:剩余红包金额为M,剩余人数为N,每次抢到的金额=随机区间(0,M/N*2)。可以通过证明每个人抢到的金额期望上是相等的。是公平的算法。
  2. 线段分割法:将红包金额看作有一定长度的线段,N个用户抢红包就是确定N-1个分割点,用户对应的区间长度就是抢到的金额。

优缺点分析:二倍均值法实现简单,空间复杂度低,但是用户间抢到的金额不会有太大差距,因此给用户的惊喜较少。线段分割法实现复杂,但是金额差距大,娱乐性更强。

知识储备

在系统设计中,核心功能这一点,一定需要你有相关领域的积累,就像我问你短链接怎么生成、红包拆分算法怎么设计、朋友圈feed流如何实现的话,你在没有思考过的情况下很难直接说出来,因此这也是我们主要需要积累的东西。推荐的学习方式就是了解各大互联网公司的核心业务,比如

美团、滴滴、饿了么:派单

抖音、B站、快手:视频推送、弹幕功能

小红书、大众点评:文章推送

京东、淘宝、拼多多:电商秒杀

微信、QQ:朋友圈、群聊、红包、消息推送

你会发现,业务场景基本被涵盖在内了。你对这些核心功能有一个大概的了解之后,剩下的部分基本就是通用啦!平时我们可以针对性的看一看相关文章。

因此平时多看看各大公司的微信公众号,多看看他们披露出来的企业级别的架构。我一般常看的公众号有:

哔哩哔哩:

得物:

京东技术:

最后:

本文章来自我的学习笔记《小牛八股》。目前正在完善中,估计今年八九月份会写完。提前放出来一些文章引引流。

关注我,带你了解更多代码之外的生存之道。欢迎订阅我的专栏(目前免费),后续也会持续更新。如果这篇文章帮到了你的话,就送我朵花花吧。

#牛客激励计划##Java##牛客创作赏金赛#
代码之外的生存之道 文章被收录于专栏

我们的生活不止有代码

全部评论
不愧是牛肉佬
点赞 回复 分享
发布于 昨天 18:00 北京
举报了
点赞 回复 分享
发布于 昨天 17:33 广东
mark红包系统设计
点赞 回复 分享
发布于 昨天 17:22 浙江
朋友们上上举报
点赞 回复 分享
发布于 昨天 17:22 浙江
涉嫌卖课点举报了
点赞 回复 分享
发布于 昨天 17:22 浙江

相关推荐

昨天 18:59
已编辑
安徽大学 后端
自己的背景 211 计算机科班硕,学院本,近半年的实习经历,独角兽公司,国企,互联网大厂都待过。自己的感受是现在互联网校招的面试难度已经是社招三年的难度,人太多,池子太小,行业发展见顶。面试很多奇怪的问题,源码的考察,让人有点摸不着头脑,不知道想要考察什么,纯粹就是想提高难度,一个环节表现不好就丧失机会,机械记忆不好的我准备起来挺费力的。但是实际上内部的大部分员工连最基本的变量的命名、测试用例、注释和文档都不好好写,代码的可维护性变得越来越低,捏着鼻子在屎山中修改代码,使用各种技术手段验证功能正确,并保证不会出现新的问题,代码的熵随着时间的推移变得越来越大,维护花费的时间变得越来越多,每天填坑,改代码,心力憔悴。很多工程师唯一的护城河估计就是对当前业务的理解,写的可读性非常差的代码让他的替代性变低,真是可悲。前几天在抖音和一个大厂出来的前辈连麦聊天,前辈毕业后 2012 年就进入搜狐,后面去了百度,一路从 Java 工程师晋升到架构师到业务主管,回到二线城市后根本找不到合适的工作,只能做独立开发,自己去打广告接单子,技术很扎实,后端,前端,简单的 AI 都可以独立搞定,建议研究生毕业后不要再去卷 CRUD 了,实话说看到前辈如此心里面很不是滋味,当年的互联网是多么风光无限,有技术的人都是被高薪抢着要的,又感慨市场规律的客观性,不以个人意志转移。IT 行业,客观来说竞争大,淘汰率高,智力密度极高,其中大部分的市场份额还被通信运营商拿走了,留给互联网行业的大概只有 4000 亿美金,这里面的大头又被 Google、Facebook、腾讯和阿里巴巴等头部大厂拿走了,马太效应非常明显的行业。好的职业具备哪些特征?吴军老师(原 Google 高级研究员,腾讯副总裁,现投资人)给出下面几个特点:首先,随着你的工作时间越长,现金流要越来越多。其次,利润率要高,而且最好不要动不动有追加投资,它会吃光收入和利润,让最终白忙活一场。再次,无论在哪个行业,要有核心竞争力。最后,要有稳定现金流的工作,大多和经济周期无关。为什么说码农不是一个好的工作?因为 IT 行业受摩尔定律的影响,每 18 个月硬件的成本就会降低一半,相同的硬件成本的性能越高,能够跑的软件就越复杂,软件就可以不断地升级实现更复杂的功能,那么程序员就需要不断地学习,程序员年纪越大,精力就跟不上,自然就被淘汰了。现在随着 Cursor AI IDE 的出现,编程已经不是什么稀缺技能了,估计很快就像英语一样成为一个基本能力,除非你能够成为顶尖高手,只是 CRUD 简单的逻辑 AI 可以做的更好。希望这个行业的前辈多考察候选人作为一个职业软件工程师具备的能力(行为面试法从过去的行为推断未来的行为,软件工程素养,工作习惯,逻辑能力,沟通能力,责任心,计算机基础,不会写出复杂度高的代码,能够持续学习的能力,筛选出真正有能力有潜力在这个行业发展的同学),而不是考察各种奇怪的问题和源码进行服从性测试。在工作中多一些耐心,做一些真正有意义有价值的事情,不断的积累实现可叠加的进步。希望行业内多一些 DeepSeek 这样的公司,引领整个行业进步,让盘子越做越大,而不是零和竞争。希望想要进入这个行业的同学,仔细斟酌,如果想要赚钱,其他的行业的市场更大,发展前景更好,人才密度更低,更有机会做出一些成就,不要被短期的利益和头部的曝光效应迷失了方向,浪费了几年的青春。#腾讯##阿里##字节##百度##美团##如果再来一次,你还会选择这个工作吗?#
点赞 评论 收藏
分享
评论
9
26
分享

创作者周榜

更多
牛客网
牛客企业服务