This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
<audio id="audio" title="春节策划第1期 | 分布式金融系统知识,你掌握了多少?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f1/49/f154978ee8996966242532c8631e0649.mp3"></audio>
你好,我是任杰。
今天是大年初一首先祝你春节快乐身体健康。专栏的正文部分已经结束相信这几个月的时间你已经学到了很多。为了让你过节期间能够轻松一些同时也能巩固之前所学这个春节假期我一共为你安排了3期特别策划的内容。
今天是策划的第1期我从之前学的课程里精选了一些知识点给你出了这一套测试题帮助你检验学习成果。客观题的答案和解析你在测试后就能直接看到。主观题我暂时不公布答案给你留下一定的思考时间。
第2期我会为你整理一份我的推荐书单。
第3期我会公布主观题的参考答案。有必要的地方我也会说明对应前面课程的哪一节课方便你查漏补缺根据需要去复习巩固相关内容。
好了,那今天我们就先牛刀小试,通过测试题来练练手吧!
首先我给你出了10道客观题5道多选5道单选你可以点击文稿中的答题按钮进入测试。
[<img src="https://static001.geekbang.org/resource/image/28/a4/28d1be62669b4f3cc01c36466bf811a4.png" alt="">](http://time.geekbang.org/quiz/intro?act_id=367&amp;exam_id=1040)
完成客观题之后,这里还有两道主观题在等着你。金融系统的特点是要求高,所以当你学会了如何解决金融行业的问题之后,其他行业的问题也就是手到擒来的事了。所谓它山之石可以攻玉,我们来看一看下面这两道其他行业的经典问题。
## 春运卖票
<img src="https://static001.geekbang.org/resource/image/a4/99/a4d1b6b50a26db1ac21ff26ed0004999.jpg" alt="">
除了支付以外技术圈还有一个广为人知的高难度系统是卖火车票。你可以从2020年初的这个新闻片段感受以下技术挑战的难度
>
今天起全国铁路开始在12306网站发售2020年1月23日也就是农历腊月29的车票节前售票高峰即将度过。自本月12日春运售票启动以来全国铁路已累计发售车票1.75亿张,**每天的发售量都在1000万张以上**。
下面是2020年初另外一篇新闻的片段
>
2020年春运期间12306在高峰日网络点击量高达1495亿次……也就是说**12306在高峰日平均1秒就要承受170多万次点击**……作为对比,**2019年淘宝的订单创建峰值是54.4万笔/秒。**
这篇新闻也提到了售票业务的复杂度:
>
而12306的特殊性在于**火车票是一种动态的SKU**,计算起来的数据量可能是普通电商产品的数百倍。
>
以北京西到深圳福田的G71次高铁为例……从北京西站始发的车票后面有16个车站即16种不同的车票涿州东站是第二站有15种不同的车票以此类推单以上下车的站来计算G71次高铁就会有16+15……+2+1=136个SKU而每种票对应3种座位一共是408个商品。
>
以上只是SKU的减值。若旅客购买的是短途票如北京西站到涿州东站则在SKU减去16的同时还要增加涿州东站到之后各站、之后各站相互间的SKU即增加120个SKU。若再叠加当前的选座功能A、B、C、D、F计算数量可能还要再翻倍。
**12306有雄厚的资金因此可以选择一些特殊的软硬件方案来解决卖票的问题。作为一个金融系统背景的人来说你应该如何分析这个春运卖票的问题呢**
## 王者荣耀
《王者荣耀》是由腾讯游戏天美工作室开发并运行的一款5V5手游。一个完整的游戏有很多功能部分比如聊天室、支付系统、电商等等在这里我们主要研究一下最核心的玩游戏的功能。
常见的游戏设置有10个客户端。每个客户端会控制自己在游戏里的角色。**所有10个角色都在同一个虚拟竞技场内交互因此每个人都能实时看到其余9个角色实时的情况**,比如位置、血量、技能等等。
手机玩游戏有一个不好的地方是信号不稳定。当手机信号不好的时候会出现**掉线的情况**。如果你掉了线,在别的玩家眼里,你一直站着不动,在你自己的眼里,所有其他人都站着不动。但是**一旦你手机连上了线系统马上会恢复到其他9个人当前的情况**,你还可以继续参与这场还未结束的比赛。
在极端情况下,**如果游戏崩溃重启了,你会发现自己依然能进入到原来的游戏**,只是加载时间稍微长了一点而已。
**那如果按照我们介绍的架构设计思路,你应该怎么设计游戏的前端和后端呢?**
欢迎你在评论区分享你的思考和分析主观题答案我会在大年初四的第3期春节策划里公布敬请期待

View File

@@ -0,0 +1,108 @@
<audio id="audio" title="春节策划第2期 | 读书如抽丝,为你推荐一些我读过的好书" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b0/72/b072396ef8c7c79b2720c8c8fc259472.mp3"></audio>
你好,我是任杰。
今天是春节策划的第2期。这期内容是分布式金融架构课的福利加餐。在专栏更新的过程中有一些同学留言想要我推荐一些金融系统相关的图书所以我为你精心梳理了一份书单希望对你有所帮助。
## 选书标准
我们这个专栏讲的是分布式金融系统,因此在选书上会涉及到计算机系统、分布式系统、金融和经济。
国外在这些基础类科学的研究上有多年的沉淀,内容经历过很多版的验证,因此比较适合学习。另外从文学理论来说,翻译的过程是一个再创作的过程,会受到翻译者自身能力的限制。如果你觉得,一本中文翻译版的技术书籍没有把问题讲清楚,很难知道原作者的问题还是翻译者的问题。因此按照溯本求源的原则,这里选择的主要还是英文版的教材。
俗话说,书到用时方恨少。对于系统开发人员来说,如果是某个具体的问题,比如软件应该如何配置和使用,可以查看相关的文档,不需要看书。如果你突然发现需要看书,那么书大多情况下都不能解决当下的问题。
因此,读书要放下急功近利的想法。要把读书作为质变的手段,而不是量变的方法。质变是一个缓慢且无法自我感知的过程,要有耐心。
后面的书单我会分成技术、经济和金融三个大类给你介绍,也会附上我的简单评价和推荐理由供你参考。
## 推荐书目的分类以及推荐理由
### 技术类
#### 领域驱动设计
领域驱动设计是Eric Evans在2000年左右提出的。《Domain-Driven Design: Tackling Complexity in the Heart of Software》这本书总结了他的一些经验。虽然内容很重要但是他的行文思维比较跳跃前后顺序不对有很大的阅读难度其实就是写得不好。
<img src="https://static001.geekbang.org/resource/image/f8/40/f890a0dbfc66dd6d588609866fea9a40.jpg" alt="">
虽然Eric Evans的书没有写太好但是领域驱动设计这个方法论实在是太过于重要了因此后面也有不少人尝试复述内容增加一些自己的合理理解。
Scott Millett写了一本《Patterns, Principles, and Practices of Domain-Driven Design》算是一本近十年来写得不错的书。但是行文比较啰嗦你需要有一些耐心知道哪些内容可以跳过。
<img src="https://static001.geekbang.org/resource/image/ff/ef/ffc48a92b97b23e027cb098bde7f82ef.jpg" alt="">
#### 数据系统
数据系统的教材首推Martin Kleppmann的《Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems》。作者有很强的理论和实践知识在这本书里总结了几乎所有我们应该了解的知识点。
由于这本书的厚度有限,很多重要的知识点只能点一下名,你需要根据每个章节后面的论文列表来进一步学习。这本书有中文翻译版,但是有中文翻译书籍的常见问题,如果你想真正了解知识,我还是建议看英文版。
<img src="https://static001.geekbang.org/resource/image/ab/03/ab014db880858381a22772ce31ff0b03.jpg" alt="">
数据系统肯定少不了数据库的内容。数据库有很多介绍怎么使用的教材但是很少有介绍系统架构的教材。Hector Garcia-Molina的《Database Systems: The Complete Book》是为数不多的一本介绍数据库系统架构的书。
书里对事务和锁的实现介绍得极其详尽浅显易懂。这本书的第二作者Jeffrey Ullman是计算机领域的传奇人物也是书质量的一个保证。这本书的问题在于书里介绍了大量的XML处理。XML是上一个风口现在已经被JSON取代因此书的重点不一定是现在的重点。需要提醒一下这本书特别难买。<br>
<img src="https://static001.geekbang.org/resource/image/9a/2e/9a510cbf403b26133bf19f6c2f7b0f2e.jpg" alt="">
有关数据库的实现现在有了一本新的书Alex Petrov写的《Database Internals: A Deep Dive into How Distributed Data Systems Work》。
有意思的是这本书的名字虽然写的是分布式系统但是书里写的单机版内容比分布式内容要好分布式内容介绍得比较凌乱重点分散。你可以当作是《Designing Data-Intensive Applications》的一个补充。
<img src="https://static001.geekbang.org/resource/image/7f/63/7f74d3e07e20cc19c52b3f645c71b663.jpg" alt="5">
#### 优化
系统架构优化得好不好,取决于你对整个系统了解得是否全面。我们按照从宏观到微观的顺序介绍一下经典教材。
这里介绍一本唯一的中文书,李智慧的《大型网站技术架构 核心原理与案例分析》。这本书对互联网架构的各个方面进行了点到为止的介绍。
内容不深,但是很全面,能让你清楚地知道都会出现哪些问题,会有哪些解法。知道了问题和解法,之后就可以按图索骥,按照关键字查询细节了。
<img src="https://static001.geekbang.org/resource/image/bb/d8/bb8384d8e1d7e76e8ff13ea6e5686dd8.jpg" alt="">
接下来,再让我们看看介绍单个计算机的教材。
Randal Bryant的《Computer Systems: A Programmer's Perspective》是一本经典教材。这本书按照从硬件到软件的顺序介绍了整个计算机系统。从这本书里你会学到如何设计一块有流水线的CPU怎么实现编译器和操作系统以及怎么让计算机动起来。内容很浅但是很全。
<img src="https://static001.geekbang.org/resource/image/97/2c/97a5538a9b1e5b5ab997b61433cb152c.jpg" alt="">
介绍完了计算机接下来我们就要仔细了解所有软件打交道最多的东西了它就是操作系统。操作系统有很多教材不过按照流行度和全面度来说我比较推荐Andrew Tanenbaum的《Modern Operating Systems》。这本书不用过多介绍。
<img src="https://static001.geekbang.org/resource/image/09/b1/09d98b6052aa3f216ff9bca4b254ccb1.jpg" alt="">
最后介绍一本关于性能监控和调优的书Brendan Gregg的《Systems Performance》。作者发明了系统调优的火焰图还是Solaris操作系统早期监控工具的发明人。
这本书列举了几乎所有的监控工具能够极其全面地让你看到计算机CPU、内存、硬盘、文件系统、网络和云计算环境当前处于什么情况以及应该如何对系统性能进行调整。重点的要说三遍极其全面极其全面极其全面。
<img src="https://static001.geekbang.org/resource/image/8f/2a/8f8147yy2afc66868c91d1b21fyyf82a.jpg" alt="">
### 经济类
经济类教材入门教材首推曼昆的《经济学原理》。曼昆年少成名担任过美国经济顾问委员会主席。他写书浅显易懂但是比较啰嗦。在书中他强调自己是中立态度不偏向某个学派但是行文之间依然有所倾向。最新版是2020年的第9版。
<img src="https://static001.geekbang.org/resource/image/2a/65/2a65ea4b08213aab476406c13f6f2465.jpg" alt="">
相对少见一些的是保罗·萨缪尔森的《经济学》。萨缪尔森是凯恩斯主义的代表人物之一获得过诺贝尔经济学奖。他于2009年辞世因此教材停留在第19版。
<img src="https://static001.geekbang.org/resource/image/38/ec/38ba9d030ec4fcb9c3c06511720e0cec.jpg" alt="">
另外微观经济学有一本书我也想推荐给你。Hal Varian写的《Intermediate Microeconomics: A Modern Approach》。Varian是Google的首席经济学家主导了公司的拍卖流程是经济学家弃笔从戎的一个成功案例。
<img src="https://static001.geekbang.org/resource/image/31/e8/316e75f741c7yy1a67dd83e34af5d2e8.jpg" alt="">
最后我再推荐一本科普读物,哈耶克的《通往奴役之路》。哈耶克是奥地利学派的代表人物之一,也获得过诺贝尔经济学奖。他的《通往奴役之路》有很多争论,请你酌情选择。
<img src="https://static001.geekbang.org/resource/image/7f/f0/7fa51796ccbc29ab8a6cf02a8e9e32f0.jpg" alt="">
### 金融类
金融类有用的教材其实不多,原因是比较实用的不是教材,而是考试材料。对于大多数人来说,他们的金融生涯需要掌握的是如何完成金融过程,而不是设计顶层的金融体系,所以理论帮助有限。
考试内容比较全面的是CFA。CFA以股票为主分析股票以基本面为主因此可能和一些实际情况有所出入。CFA也介绍了一些其他金融资产的知识但是和现状相差较远不能学以致用。虽然有各种不足但CFA对于立志于跨行业的人来说是一个不错的敲门砖。
金融学有一本教材写得还不错是Mishkin的《Economics of Money, Banking and Financial Markets》。作者在2008年金融危机中被人诟病但是他丝毫没有受到影响。这本教材从稍微学术一点的角度介绍和分析了各种金融市场数据翔实是一本不可多得的好书。
<img src="https://static001.geekbang.org/resource/image/f2/1c/f219a1b559d5158cb5353358f3969c1c.jpg" alt="">
好了,以上就是书单的全部内容了。关于金融系统或者金融方面的内容,你有什么正在阅读或者计划阅读的书呢?欢迎你在留言区分享出来,我们一起交流、进步。

View File

@@ -0,0 +1,105 @@
<audio id="audio" title="春节策划第3期 | 如何运用架构知识解读春运买票和手游案例?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d9/5e/d9707d9daf192e3836a8a999f4e0db5e.mp3"></audio>
你好,我是任杰。
今天是大年初六估计你还在假期中所以首先祝你假期愉快。不知道我在春节策划第1期留的两道主观题你想到了怎样的方案呢接下来我就来公布参考答案啦希望对你有所启发。
## 春运卖票案例分析
Q除了支付以外技术圈还有一个广为人知的高难度系统那就是卖火车票第1期的完整题干点击[这里](https://time.geekbang.org/column/article/342646)回顾。12306有雄厚的资金因此可以选择一些特殊的软硬件方案来解决卖票的问题。作为一个金融系统背景的人来说你应该如何分析这个春运卖票的问题呢
A我们先分析一下新闻数据。
从第一个新闻可以算出来一天累计发票1000万张所以约等于每秒115笔交易。这个平均值并不算太高。如果考虑到峰值情况我们大致可以估算出网站的峰值TPS在几百到几千左右。
从第二个新闻我们可以算出来在峰值情况下网站的QPS接近200万。新闻里也提到了淘宝的订单TPS在50万左右因此12306峰值的QPS是淘宝峰值TPS的4倍。
这两个数据的比较并没有给我们额外的信息因为优化TPS的架构和优化QPS的架构非常不一样这两者没有可比性。而且TPS会更难处理TPS值低一些很正常。
分析到这里还没完我们还需要把这两个新闻合在一起看。春运卖票的TPS在几百但是QPS在200万因此它是一个查询量极其巨大但是交易量正常的业务。
这就意味着,**我们系统架构需要优化数据的查询。**
你还记得,我们在[第7节课](https://time.geekbang.org/column/article/326583)讲事件溯源的时候提到过一个优化查询的架构设计方案么这个方案叫CQRS也就是读写分离。
这里我们也可以应用这个思路,把订票和余票查询分开。订票是一个独立的系统,负责维护所有的出票信息。余票的查询是另外一个系统,负责给客户端提供查询服务。订票系统负责将出票信息异步同步给余票查询系统。这个架构示意图如下:
<img src="https://static001.geekbang.org/resource/image/5b/82/5b0566bf64324434cf23b555ee7e3682.jpg" alt="">
**读写分离的一个优点是可以对读和写分开做优化。**我们先来看看写的优化。
第二篇新闻里提到了在写入时需要维护的状态也就是“动态的SKU”其实就是每列车在每个站点的座位上坐的是谁。我们来初略估计一下状态数有多少。
假设全国有1万个站点一共10万辆火车每个火车可以装1万人每列车每天把全国所有的铁轨跑10趟那么数据量一共是$10^{14}$也就是100T。这个数据量并不大现代数据中心里大概一个机柜用内存就能全部装下所以**数据量大小并不是挑战**。
我们再来看看数据的操作复不复杂。我们在买票的时候有一些复杂的选项比如是不是靠窗几个座位是不是连在一起是不是VIP等等但是这些复杂度都在于查询。
真正的出票操作是在你准备支付的时候。这时候为了防止你已经选好的票被别人抢走,系统需要在你支付完成前锁定你的票。因此,**出票的操作需要对一个车次的连续几个站点的同一个座位进行上锁操作。**
所以对于数据的写入操作来说如果我们把火车票粒度做个划分划分成每个车在每个站点的每个座位之后问题就变成了1万TPS以下的多个火车票座位的上锁问题。根据第一篇新闻提供的数据这个上锁操作在1万TPS以下因此大部分的数据系统都能够支持。
我们再来看看读的优化,这里才是春运卖票的真正复杂度。我在前面提到过,火车票在购买的时候有多种不同的查询条件。简单一点的是按照车次和日期为查询级别,复杂一点的是按照座位的位置。粒度越小,查询的复杂度越高。
由于查询需要计算而事务的处理只需要加锁查询是一个更加消耗CPU和存储空间的过程。
那么读的挑战有多大呢第二篇新闻告诉我们大概在200万QPS。这么大的QPS显然不能用一台机器解决而是需要用到多台机器来处理。
我们在[第19节课](https://time.geekbang.org/column/article/341048)提到过,如果一个业务可以被拆分到两台机器上处理,那么一生二,二生三,三生万物,我们可以把业务分到任意多台机器上处理,这样只要堆机器数目就可以了。那这么做可行吗?
不知道你发现了没有,**票务查询有一个特点是任何两个查询之间不会互相影响,也就是两个读操作之间没有冲突。**没有冲突的操作可以并发执行,而不会产生任何意料之外的结果。这就是我们在[第12节课](https://time.geekbang.org/column/article/334878)提到的唯一没有冲突的情况。
接下来,我们再看看读操作分布式处理的另一个可行性原理。
不知道你有没有过抢火车票的经验。也许你也有类似的这种经历,明明你可以查到票,但是在购买的时候,系统却提示你已经卖光了?
通常来说你这时候不会投诉12306说给了你错误的信息而是会再查下一趟车是不是还有票。这意味着从查票的业务来讲我们默认接受了查询信息和实际信息不一致的情况。
所以,我们可以选择将出票信息异步推送给查询系统。查询系统可以根据查询的复杂度来做更复杂的索引。**虽然查询的机器很多,数据推送需要时间,索引的建立也需要时间,但是购票的业务并没有读写事务性的要求,我们在架构选型时可以牺牲时效性来换取吞吐量。**
以上就是春运卖票的架构分析。从整个分析过程中我们可以看出,架构的真正挑战在于读的部分。而因为卖票业务不要求读写在同一个事务处理,这给了读操作极大的优化空间。
## 王者荣耀案例分析
《王者荣耀》是一款5V5手游。常见的一场游戏设置有10个客户端。每个客户端会控制自己在游戏里的角色。所**有10个角色都在同一个虚拟竞技场内交互因此每个人都能看到其余9个角色实时的情况**,比如位置、血量、技能等等。
手机玩游戏有一个不好的地方是信号不稳定。当手机信号不好时会发生**掉线的情况**。如果你掉了线,在别的玩家眼里,你一直站着不动,在你自己的眼里,所有其他人都站着不动。
但一**旦你手机连上了线系统马上会恢复到其他9个人当前的情况**,你还可以继续参与这场还未结束的比赛。在极端情况下,**如果游戏崩溃重启了,你会发现自己依然能进入到原来的游戏**,只是加载时间稍微长了一点而已。
**那如果按照我们前面学过的架构设计思路,你应该怎么设计游戏的前端和后端呢?**
A我们在第7节课讲事件溯源架构的时候就给你举过一个游戏的例子。这里我们也这样做假设用事件溯源的方式来解决游戏掉线的问题。
事件溯源架构需要定义好命令、事件和状态。那我们来看看,对于手机游戏来说,怎么分析命令、事件和状态。
按照命令的定义,命令指的是外部的指令。对于手机游戏来说,唯一的外部指令就是你在手机上的操作,比如你在某个时间点击了屏幕的某个位置。但是这个命令过于粗放,不同的手机类型不一样,屏幕大小也不一样,这个位置信息不具有通用性。
因此手机App需要把你的物理命令解析成在游戏中的逻辑命令。比如说你在屏幕上点了一下这个是物理的操作。而游戏可以把这个操作翻译成让角色往右走。
有了命令之后,接下来就需要分析什么是事件和状态了。这两者紧密地结合在一起,因此我们一起分析会比较好。
游戏状态就是10个角色和整个竞技场当前的情况比如角色的位置、血量、技能等信息。事件就是能改变这些状态的、已经发生过的事情。比如说角色已经往右走了一步或者释放了一个技能等等。
到这里还没有结束我们还忽略了一个重要的信息那就是玩游戏的10个人怎么才能让他们看到其他人的情况呢这意味着有一个方法能将玩家们所有的命令和事件都集中在一起。这就是游戏服务器需要处理的事情。
因此所有10个人的命令会先发给游戏服务器游戏服务器会将所有的命令进行排序这样就能知道玩家们操作的先后顺序。然后就生成事件更新状态。
这里又出现了一个新的问题,那就是状态存储在哪里。一个选项是将状态存储在服务器端,另一个选项是将状态存储在手机端。接下来,我们分情况做个讨论。
如果将状态放在服务器端那么服务器用自动机计算好状态后需要将状态传送给10个手机用户。如果是将状态放在手机端那么手机需要实现自动机。由于自动机也负责将命令变为事件这意味着事件的生成也需要放在手机端完成。
这两个选择的依据在于数据量的大小。**手机游戏用的是手机信号,吞吐量并不大,因此数据量传输得越少越好。所以合理的选择是将自动机放在手机端。**
下图展示了一个可能的游戏架构图。在这个架构里,服务器只负责接受所有的命令,以及对命令进行排序。手机端负责所有命令的处理和状态的更新:
<img src="https://static001.geekbang.org/resource/image/1e/54/1ebbe4cb14126579e627eea4d4cf7f54.jpg" alt="">
由于这个游戏架构采用了事件溯源的设计,因此也具有了事件溯源提供的时光机,读模式节点等等所有能力。其中,时光机可以用来实现掉线之后重连,读模式节点可以让解说员也能实时看到游戏进度。你可以再思考一下,还有哪些游戏的使用场景也用到了时光机。
在这里我想说明的是事件溯源的这些能力有一个假设那就是自动机不能具有任何随机性。但是手机有很多种型号的CPU这些CPU处理浮点数的精度不一样因此游戏公司通常都需要在App端实现跨平台的浮点数计算中间件。
好了,主观题我就给你分析到这里。不知道你有没有发现,复杂的系统总是在宏观上类似,在细节的地方各有千秋。
我之所以选择两个金融行业之外的案例,是想提醒你,架构的核心知识其实是通用的,关键是我们作为开发人员怎样合理去使用。
春节策划的内容到这里就全部结束了,我们下期再见!