Please enable Javascript to view the contents

系统设计入门-概论

 ·  ☕ 5 分钟

TOC告诉我最好有个小标题:->

嗯,又是好几个月没更文章了,这期间做了些力扣题,除去毕设和实习上一些杂七杂八的事情,真正静下心来学习的时间还是很少。不过,目前给自己立的一个最新的Flag是学习系统设计方面的知识。

想学的原因是自己毕竟用过了 MongoDB, Redis, CDN 这些现代应用系统内常常会涉及到的组件,此外在之前折腾博客的时候也已经简单接触过了域名服务、缓存这样很有实用性的东西。也算在垒土之上,学着试着,看看能不能筑几层台。

咳咳~

这里先放一张表,表里记录了常见设备的时间性能(在想Latency在这里能不能给译作 —— 延迟?或者 —— 开销?)。这张表搬自有名的 Latency Numbers Every Programmer Should Know,意译过来就是“程序员必知的设备开销量级”

操作 开销 天文质量
L1 缓存引用 0.5 ns 1/2个地球或5个火星
分支预测错误 5 ns 5个地球
L2 缓存引用 7 ns 7个地球
互斥锁·加/解锁 25 ns 天王星 + 海王星
主存的引用 100 ns 土星 + 5个地球
在1Gbps带宽下以Zippy算法压缩1K字节 3000 ns 10个木星
在1Gbps带宽下发送1K字节 10,000 ns 全太阳系行星质量的20倍
从固态硬盘中随机读取4K字节 150,000 ns 1.6倍的红矮星 Wolf 359
从内存中顺序读取1M字节 250,000 ns 四分之一个太阳
从固态硬盘中顺序读取1M字节 1,000,000 ns = 1ms 一个太阳
磁盘的seek操作 10,000,000 ns = 10 ms 10个太阳
从磁盘上顺序读取1M字节 20,000,000 ns = 20 ms 一个红巨星 R136a2
一个网络报文从美国加州到荷兰的往返时间 150,000,000 ns = 150 ms 一个中等大小的黑洞

当然,上面这张表是2012年时候的数据,作为补充,这里有份17年的测试数据。根据摩尔定律(虽然它的斜率越来越平缓了),现在的内存和SSD等硬件的读写性能远非昔日能比【这不,马斯克的 starlink 也要上线了么,声称其全球平均时延 30ms !】,同时这些数据也跟它的测试平台和硬件的体系结构强相关,所以表里的内容基本都过时了。但可以给我们的一个启发是,熟悉各种硬件性能对软件设计,尤其是系统设计,应该大有裨益【咱只是初学,有多裨益也不敢太肯定hhh】

似懂非懂的问题

我一直有些似懂非懂的问题,这些问题也持续困扰着自己,比如:为什么我的程序读写文件很慢(也就是CPU访问硬盘很慢?)、为什么有了Mongo这样支持高并发场景的数据库了业务上还需要缓存这样的东西?为什么你的博客第一次打开很慢,以后再打开就特别快了呢?……(简单地两句话是能解释的,但自己对这些问题的把握不够清晰,说到底还是东西学得不够扎实)

可以看到这些都是些很实际的小问题,这些实际问题的解决往往离不开设计良好的系统支持,不期望能学会“系统设计”【小菜竟然敢提“学会”?】,而是尽量搞明白设计中的一些准则,熟悉各种常用的组件。这就算达到自己的预期了吧hhh【我还是太菜了,Flag立着立着好像自己就要倒了;-(】

怎么学习?

学习一门全新的东西,我们总要从最基础的东西抓起。比如初学一门编程语言,绕不开的就是看它的循环、分支怎么写,学用它的标准库,然后把握语言的突出特性,比如:哎你看现在人人都学Python是为啥咧?这其实就很好反映了Python本身是一个语法简明的解释型语言,学习的正循环建立的快,对初学者很是友好,不用考虑编译,熟练的上手就是半小时上百行的代码量,写起来就很舒心;哎我听说Golang最近很火拿来写微服务很合适,这就跟它语言层面对并发编程的支持有关系;哎我又听说最近那个Rust也很棒呀,特别安全就是,感觉未来区块链和高性能计算它会一枝独秀噢,这都跟它语言层面引入了所有权和生命期这种东西有关了。

“搜嘎~ 可是你还是没有讲明白怎么学习系统设计呀?!“

“啊这…其实怎么学习我也没谱hhh【明明都告诉咱是小菜了】”

这里贴一个知乎上的答案,里边谈了该如何学习系统设计:浅谈系统设计

我的理解是这东西只能多coding,比如以后有时间自己去实现一个kv数据库,或者自己去做一做微服务(之前试过,但浅尝辄止了),完了再就是多积累经验吧,这不可能像刷题一样短期内能见效,得讲静水深流的时候也只能让它慢慢流了hhh。

学到什么时候才能设计?

其实这个问题的答案很明显,只能等自己功力足够深厚的时候才能谈得上“设计”吧,在这之前的阶段,自己写的程序大概能做好“我实现了xxx”并能确保代码的可读和鲁棒就已经是一枚及格的“螺丝钉”了hhh。以自己的经验来讲,看一个人写的文章、聊的东西其实就能很自然地展现他的功底到底怎样,比如下面注释2的叫Draveness的博主,他的文章满是谈设计、剖析设计思路,远非csdn上的那种大段大段地贴代码然后一顿解释的文章(还有很多是半懂不懂的瞎解释)。

今天是周六!开心~

抱着零食,坐等今晚的CCTV6佳片有约哈哈哈【其实是写着写着就写不下去了hhh】

资源推介

最后,推荐一些个人认为比较好的系统设计方面的学习资源:

专门给我这样的小菜准备的好东西:https://github.com/donnemartin/system-design-primer

博主是K8S的贡献者【此处应留空,用来膜拜大神】,很多设计上的问题他都讲的很好:https://draveness.me/

这是一个精简的爬虫框架,可根据使用需求扩展之:https://github.com/kingname/Tinepeas

设计一个K-V数据库:http://blog.gainlo.co/index.php/2016/06/14/design-a-key-value-store-part-i/