<
查看: 15017| 回复: 20
收起左侧

[经验总结] [抛砖引玉] System Design的个人见解和一些例子

   
无量塔 来自APP | 显示全部楼层
本楼:   👍  45
100%
0%
0   👎
全局:   821
95%
5%
39

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 无量塔 于 2022-12-18 13:39 编辑

本人这几年在大厂打工,目前在小厂做senior。写这个帖子只是想分享一下自己平时工作、学习和准备系统设计的见解,欢迎大牛分享更好的经验。


工作中积累系统设计的经验
实话实说,系统设计又广又深,很难速成。积累系统设计经验最好的途径还是靠平时工作多做相关的项目,或者学习公司内其他组做的设计,毕竟这些都是工业界的经验,经得起推敲。举一个例子,本人在组里负责过几个系统设计,刚好都是面试里的经典题目。在设计期间非常深入地了解了各种solution的实现细节和优缺点,甚至细到了hardware参数和load test的result,而且设计和实现的时候都踩了不少坑,获得了不少实战经验。这些经验远比网上或者youtube上面的素人案例要详细和具备可行性,所以面试中遇到这些题目基本是我在主导,甚至会涵盖一些面试官都没想到的方面,都获得了positive feedback。因此,平时工作中请多留意做系统设计的机会。

就目前市场上系统设计面试经验来看,无论是mid level还是senior level都会遇到各类不同的题目(广度的考察)。Mid level对系统设计的考察不深,一些technology和domain不太懂没关系,能给出一个make sense的方案就过关。Senior level以上的面试就对广度和深度有一定要求,会非常深入地讨论你的(多个)方案,很多时候你需要主动用数据和经验来支持你的solution,如果你对面试涉及的某个方面不太懂,基本上面试挂了一半。所以工作经验尚浅的时候可以多换组或者做不同的项目来拓展经验的广度,等到有一定经验之后长待某个组/领域来拓展深度,然后你会发现很多东西是相通的,这样可以进一步强化对不同领域的理解。

虽然很功利,总结下来,趁年轻多接触各种不同的东西,可以让你到senior的时候少走很多弯路。如果公司不提供这些机会可以考虑一下这个公司是否适合你 :)


学习和准备系统设计面试
这里我想聊聊长期学习系统设计的一些建议,这可能不适合速成选手。

打基础
  • Designing Data-Intensive Applications (DDIA): 很多人把DDIA奉为神书或者senior level才需要抽时间去看的书,但我觉得这就是一本entry level该读的基础工具书。这本书好的地方是围绕data讲了很多工业界在分布式下是怎么处理数据的以及一些相关的底层知识,这也基本是系统设计的核心部分。但这本书并不能让你突然开窍明白怎么去完整地解决一些面试会遇到的系统设计问题(除了一些偏底层的系统设计,比如snowflake会问怎么设计key-value store),所以读完此书后还需要学习实战中会运用到的手段和一些实际案例。而且这本书对于batch/stream processing的部分讲得很差,需要额外的书籍来补充。
  • System Design Primer (link): System Design Primer初步介绍了一些系统设计会运用到的手段,适合初学者学习概念。但可能因为这个资源是网络上大家收集来的缘故,部分内容和定义是存在谬误的,所以大家学习的时候不要死记硬背,请尝试自己思考一下。
  • 高并发系统设计 40 问 (link): 是的你没有看错,国内其实存在一些不错的架构设计学习材料,网上一搜一大把(比如阿里亿级高并发系统设计),写得还比较系统。这里提供的一个例子对于补充基础知识和学习一些处理手段有帮助。
  • 论文: 这里会比较推荐阅读Google的三驾马车(GFS,MapReduce,Bigtable)和Amazon的DynamoDB。如果英文阅读比较困难的话可以看这位博主的中文笔记。
  • 其他书籍: 有空的话可以看一下Designing Distributed Systems这本蓝皮书,内容可能没有上面几个好。至于batch/stream processing和real time system,地里这个置顶帖推荐的Real-Time Analytics这本书其实topic选得不错,可惜内容写得一塌糊涂,可以按照它的topic上网搜资源学习。目前batch/stream processing和real time system我还没找到特别好的学习资源,也许直接看Kafka、Flink等等书籍有帮助,欢迎大家分享一下更好的经验。


案例学习
基础打好了之后,就要开始参考各种案例来扩展自己的视野。如果你身在大厂,那么学习案例的最好途径就是看其他组做的design(比如成功运用到production的)。像Google、Meta、Amazon这些产品比较多的公司就是学习案例的宝库,通过阅读其他组好的design能让你明白一些问题的工业界的解法是什么样的,对面试很有帮助。
网上的资源多是素人经验,他们可能单纯地在猜工业界会怎么做的,很多解法根本经不起推敲,在学习的时候需要注意甄别。我会在最后附上一些好的例子作为参考,但这里想点名一下不太好的资源。

Avoid at all costs级别(打个码免得来骂我lol):
T*ch D**mies
E*pon*nt
G**rav
简直就是误人子弟,胡说八道,我都怀疑有些人不是SDE或者根本没毕业。某些机构提供的System Design mock简直就是搞笑,这么面别说我作为面试官会挂你,这么搞平时公司design review都不会过好吗。

某些能看级别:
Grokking
它的基础讲解部分和第一个例子design id generator还算能看,别的案例请不要阅读。

Alex Xu的两本System Design Interview书
第一本跟Grokking差不多水平,内容少而且太浅了,不推荐。
第二本应该是基于第一本的feedback加了不少内容,能看到每个案例明显长了很多。但不知道是不是因为多个作者或者网上资源收集的缘故,每个案例之间割裂感很强。比如有些案例是共通的,明显可以使用相似的思路来解决或者融会贯通,但在书里面没那么做且解法相差甚远,像是两个不同的人写的。而且虽然案例内容变多,但有些内容能明显感觉是强行在堆字数,花了很大篇幅讲一个并不重要的点,而略过很多该讨论的地方,有点可惜。不过目前系统设计学习的好资源还是少,第二本还是值得购买学习的,希望作者出第三本的时候能写得更好。

System Design Interview(YouTube东欧大哥)
他的Rate Limiter讲得不错可以参考,但Top K请不要参考他的solution。不知道是不是他的一些解法有点过时了,面试按他那个思路讲,面试官眉头皱得跟蛋糕卷似的,直接挂了。后面我自己学习了一下近几年工业界的解法才明白他有些做法不太合理。最近看他打折卖课(这里就不打广告了),选的topic作为基础学习还可以,等我有空买一个看看再回来更新。


面试的一点提示
版上有很多帖子都分享了一些答题的模板和步骤,这里就不再赘述了。但不要生搬硬套这些步骤,请理解这些流程的核心是什么。

很多系统设计面试基本是围绕着requirements和data展开的,从requirements搞清楚你需要什么样的data。从而进一步推导data的大小、pattern是什么样的,要怎么处理,怎么存,怎么读,怎么保证data integrity等等(设计schema和API都是为了处理data)。面试中面试官时常还需要你画图,一方面是验证你选择了合理的infra,另一方面是要确定你的data flow是正确的。读到这里你可能已经会发现,这就是基于data在做design。这也是为什么DDIA是一本不错的基础书籍,因为它围绕着data这个topic分享了很多工业界的经验。一开始工作/面试经验不足时,遇到没见过的题目经常脑子里没有任何思路,但理解了自己要处理什么样的data之后,基本上答题就是基于经验选择合适的手段来一步一步处理数据。另外一点是,类似算法题,很多设计题目是有互通的部分的(换皮),比如说群聊和多人棋牌游戏有些部分是可以用相似的手段处理。当你面多几次经验多了之后,会发现来来回回就那么几个套路(以后面试市场卷起来了之后倒是可能出新题或者考察新的方面)。

很多答题教程都会提到要计算数据量,很多人会问,真的要计算得那么细吗?如果是在工作中做design,当然要计算得那么细,特别是会影响你对于long term scalability和cost上的考量。如果是面试,根据我目前的经验来看搞明白量级就差不多了,比如究竟是TB还是GB、百万级还是千级QPS,来决定合理的处理手段(in-memory vs database, SQL vs NoSQL, CAP strategy etc)。当然如果你在面senior以上的面试,随手就能算出精确的数字甚至给出infra的具体选择和cost analysis,这会是加分项。

最后一点,面试的运气成分比较大。有时候遇到一些奇葩或者特别ego的面试官,任何技巧都是不管用的 :)


系统设计推荐案例
这里分享一些好的例子是长什么样的,这样大家能培养一下感觉怎么去甄别网络资源。上面提到过若干次系统设计其实多数围绕data做design,如果一个案例连schema怎么设计都没搞明白或者糊弄过去的,你整个架构吹得天花乱坠都站不住脚。如果喜欢的话可以自己存成pdf,以防以后链接失效。

Rate limiter
https://www.youtube.com/watch?v=FU4WlwfS3G0
东欧大哥给的一个经典案例,面试按这个答没有问题。Schema上不需要做过多的设计,你就简单存几个数字和identity就行了。但这里例子欠缺的部分是,design is not a one-way door,并不是你用了distributed就不能用local rate limiter来做safeguard,在保证availability方面可以考虑得再深一点。同时mesh结构的distributed throttling会不会有N^2的问题,过几年会不会对CPU使用率造成影响?如果我要基于CPU或者memory进行rate limit怎么做?这些都是可以进一步思考的问题。

Chat application
https://towardsdatascience.com/a ... cation-3f34fd5b85d0
一个new grad几年前写的文章,但实际却比很多素人案例做得要好,数据处理的部分对于一个new grad来说写得很好了。虽然有部分设计我觉得有瑕疵,但整体感觉是面试中可以给过的一个方案。

Job scheduling system
https://towardsdatascience.com/a ... system-b25693817950
同个作者,意见同上。

Tiny URL
https://mp.weixin.qq.com/s?__biz ... 8164021867167744#rd
这是个中文资源,但我觉得比Grokking的例子讲得更好更具备可行性。

Type ahead/Auto complete
https://mp.weixin.qq.com/s?__biz ... 167744&scene=190#rd
https://mp.weixin.qq.com/s?__biz ... 8164021867167744#rd
同一个公众号的文章,也是比较详尽地介绍了一个可行的做法。

以上就是一些我觉得还可以的例子。另外一点就是,案例的解法最好接近正常工作中会采用的solution,而不是自己的臆测。这种sense可以来源于平时工作经验的积累,也可以通过观看、阅读其他公司的tech talk。比如InfoQ的YouTube频道就有不少tech talk是关于一些经典架构的(e.g. Slack),或者是Uber、Dropbox甚至是美团的tech blog都有不少好文章分享他们怎么处理一些架构问题。不过他们一般对data细节的分享比较保守,需要你自己推敲他们怎么设计schema和处理数据的,毕竟那是他们的老底 :)


结语
希望以上能帮助到大家,可以的话求点大米,如果有错误的地方请轻拍 :P
欢迎分享更好的经验!

补充内容 (2023-11-02 13:33 +08:00):

很久不见,回来更新一个觉得还不错的素人,给了不少讲得还行的案例
https://github.com/systemdesignfightclub/SDFC/

评分

参与人数 30大米 +34 收起 理由
pud + 1 很有用的信息!
TitaniumYue + 1 赞一个
yangmq + 1 赞一个
whicter + 1 很有用的信息!
老狗识途 + 1 给你点个赞!

查看全部评分


上一篇:请教一道SD面试题以及如何深入的提高系统设计能力
下一篇:一起学习Grokking the System Interview

本帖被以下淘专辑推荐:

HelloWorld258 2022-12-29 12:06:52 | 显示全部楼层
本楼:   👍  4
100%
0%
0   👎
全局:   2568
96%
4%
115
本帖最后由 HelloWorld258 于 2022-12-28 20:32 编辑
anonymousturtle 发表于 2022-12-24 16:52
感谢lz分享!

可以请问一下top k的正确解法吗?有没有什么比较好的参考资料?谢谢

尝试回答一下,这题我面试遇见过4 - 5次了。一般都是结合top k most hit endpoints/top k products from N endpoints/products。总结下来就是QPS会很大,但是总数N不会很多,内存可以轻松存下来。

top k 问题一般的考点就是real time rough estimate vs offline accurate result。

计算精确值的时候可以用HDFS或者Cassandra存每小时或者每天的数据,一个定时的map reduce job来根据需求计算这段时间内的top k(可以细化到秒)。长期的metadata可以直接删除也可以migrate到成本更低的S3里面。统计的top k result根据需求可以丢不同的数据库里。这里常问的点就是ingest这么多数据的时候如何来避免写过热。

Real time具体看QPS的大小,标准解法就是每个service直接把需要统计的项丢一个Kafka topic里面用Kafka来decouple ingest, 然后real time Kafka + Flink来统计每秒top k。但是要是QPS太大比如1M左右,其实real time也可以用batch来做in memory batch update的,每个server用in memory的hashmap来存key和counts,每200ms 提交一次in memory的这个result到 Redis里面然后另外每秒对Redis做real time Top K计算。我一般都会把这两种解法抛出来然后讨论下trade off。如果有需求做real time + historical top K 的话 real time计算出来的结果不能删除得和之前的甚至long term的结果结合起来做一个联合的top K。

评分

参与人数 1大米 +1 收起 理由
zcoj + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

Hmoon 2022-12-29 13:32:20 | 显示全部楼层
本楼:   👍  2
100%
0%
0   👎
全局:   2603
88%
12%
367
chat app我推荐阿里的,但是呢,面试官不一定喜欢。。。
https://developer.aliyun.com/art ... le.8.4ee36b1bVFt5Ee
https://developer.aliyun.com/art ... le.9.4ee36b1bVFt5Ee
https://developer.aliyun.com/article/710363
网上其他的 除了楼主推荐的,其他的根本没法看,包括Alex Xu的
回复

使用道具 举报

 楼主| 无量塔 2022-12-28 03:10:09 | 显示全部楼层
本楼:   👍  2
100%
0%
0   👎
全局:   821
95%
5%
39
本帖最后由 无量塔 于 2022-12-27 11:12 编辑
anonymousturtle 发表于 2022-12-24 16:52
感谢lz分享!

可以请问一下top k的正确解法吗?有没有什么比较好的参考资料?谢谢

这个问题一般面试会选择Lambda或者Kappa architecture来回答,目前网上好像没什么很好的资源。
可以参考这些资料学习:
http://vda-lab.github.io/2019/10/lambda-architecture
https://www.kai-waehner.de/blog/ ... acing-batch-lambda/
https://www.cnblogs.com/xiaodf/p/11642555.html
https://www.uber.com/blog/kappa- ... -stream-processing/
https://blog.allegro.tech/2020/01/design-for-failure.html

然后这里有一个Lambda的例子,给了一个直接在cassandra里生成若干分钟内的Top K result的。
https://github.com/apssouza22/lambda-arch

面试的时候需要注意回答你要存什么样的和传输哪些数据,什么时候做aggregation,window怎么定义的,result要怎么存,什么时候应该做recalculation。在拿Top K result的时候可以思考一下究竟是pre-compute存入数据库,还是实时计算等等。Infra可以学习一下Kafka,Hadoop,Flink,Spark Streaming,AWS Kinesis,AWS Athena,Elastic Search。

有一个坑就是,sketch算法不要乱答。我建议是除非面试官问到或者本身系统有资源上的限制才会考虑sketch。YouTube Top K给的例子上来就把Lambda的speed layer用sketch代替很容易踩坑。

评分

参与人数 1大米 +1 收起 理由
anonymousturtle + 1 很有用的信息!

查看全部评分

回复

使用道具 举报

隐心月 2022-12-23 03:05:39 | 显示全部楼层
本楼:   👍  1
100%
0%
0   👎
全局:   158
98%
2%
4
牛逼,一直以为我把网上能找到的资源都看了。。。
回复

使用道具 举报

sdlcenjoy 2022-12-23 05:17:47 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   23
100%
0%
0
建议楼主出书👍
回复

使用道具 举报

 楼主| 无量塔 2022-12-24 06:22:19 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   821
95%
5%
39

哈哈目前水平还是不太够,等我再沉淀几年
回复

使用道具 举报

Denji 2022-12-24 07:28:06 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   81
99%
1%
1
感谢楼主的分享,结合之前其他大佬的帖子觉得楼主说的是很中肯的。想问问楼主,作为NG开始学习SD(不单单是为了面试,也为了提升自己),先看DDIA,再看Alex Xu这个顺序合适吗,还是应该反过来?
回复

使用道具 举报

 楼主| 无量塔 2022-12-24 07:41:01 | 显示全部楼层
本楼:   👍  1
100%
0%
0   👎
全局:   821
95%
5%
39
Denji 发表于 2022-12-23 15:28
感谢楼主的分享,结合之前其他大佬的帖子觉得楼主说的是很中肯的。想问问楼主,作为NG开始学习SD(不单单是 ...

我建议是先看DDIA和System Design Primer。
回复

使用道具 举报

anonymousturtle 2022-12-25 08:52:36 | 显示全部楼层
本楼:   👍  1
100%
0%
0   👎
全局:   16
100%
0%
0
感谢lz分享!

可以请问一下top k的正确解法吗?有没有什么比较好的参考资料?谢谢
回复

使用道具 举报

Killua1222 2022-12-25 09:07:28 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   1506
98%
2%
29
谢谢楼主!Mark一下
回复

使用道具 举报

lilydiaz 2022-12-25 16:32:42 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   434
96%
4%
18
mark以后晚点来看
回复

使用道具 举报

ilikesoccer 2022-12-27 00:12:08 来自APP | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   144
98%
2%
3
感谢楼主分享,mark 一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

Advertisement
>
快速回复 返回顶部 返回列表