左耳听风_084_83_程序员练级攻略分布式架构工程设计
你好,我是陈浩,我名猪尔多耗子。
今天这节课我们来讲一讲如何学习分布式架构。
工程设计要学好分布式架构呢?你首先需要学习一些架构指导性的文章和方法论,也就是分布式架构设计原则。
那这里呢有几篇很不错的文章,值得一读。
第一篇叫做designs lessons and advice from building large distributing systems.那这个呢是google的杰夫迪恩,在二零零九年一次演讲的PPT,在二零一零年斯坦福大学请杰夫迪恩到大学里给他们上了一节课啊,你可以在优谷上看一下。
他回顾了tugoogle发展的历史,第二篇叫做the twelve factor app.如今呢软件通常会作为一种服务来交付。
那他们呢被称为网络应用程序啊或者软件及服务。
Sars child factor给构建sars应用提供了方法论,是架构师必读的文章,这篇文章在业内的影响力很大啊。
必读第三篇叫做northern distributy systems, a young blood,他可以准备进入分布式系统领域的人一些忠告。
第四篇叫做undesigning and deploying internet scale services.它呢是微软windows line服务平台的一些经验性的总结文章,很值得一读。
第五篇叫做force things to keep in mind when building a platform for the那这个呢是box平台的VP海蒂威廉姆斯撰写的一篇文章。
那他呢阐述了为企业构建平台的时候,需要牢记的四件关于软件设计方面的事儿。
那第一呢就是design broadly leilonararily.第二platforms are powerful and flexible, choose wisely what to expose one.第三,build incrementally get feedback and eat red.第四,create a platform first mortality.那这几点呢,在文章里有详细的解读,推荐看一看第五篇叫做principles of kkills internaaring.我们知道netflicx公司有一个叫chaos monkey的东西,那这个东西呢会到分布式系统里面去瞎搞啊,以此来测试系统的健壮和稳定性。
在这个视频当中呢,netflix分享了一些软件架构的经验和原则,值得一看。
第六篇叫做building fast and resilient web applications.那这个呢是伊利亚格里高居克在google IO二零一六上的一次关于如何通过弹力设计来实现快速和可容错的网站架构的演讲。
那其中呢有好些的经验分享,第七篇叫做design for residency.这篇文章带我们全面认识弹力以及弹力对于系统的重要性,并且呢详细阐述了如何设计和实现系统的弹力。
第八呢是微软的error网站上一系列的design principle的文章啊,你可以看看这几篇分别是design for self healing design for scheduling out和design for evolution.第九呢是eventually consistent AWSCTO维尔纳沃格尔斯发布在自己block上的一篇关于最终一致性的好文第十篇writing code scalls.那这个呢是rep space ace的一篇很不错的博文,他告诉了我们一些很不错的写出高扩展和高性能代码的工程原则。
最后一篇文章automate and abstract license from facebook和engineering for scale.软件自动化和软件抽象是软件工程中最重要的两件事了。
那通过这篇文章呢,我们可以看到facebook的关于这方面的一些经验和教训。
那有了方法论之后呢,你还需要学习一些比较细节的落地的技术。
那最好的方式呢就是学习被前任总结出来的设计模式。
那虽然设计模式也要分场景,但是呢设计模式可以让你知道一些套路。
这些套路啊对于我们设计的分布式系统有非常大的帮助。
它不但可以让我们少走一些弯路,而且呢还能让我们更为系统和健壮的设计我们的架构。
那接下来呢我推荐一些分布式架构设计模式的网站。
首先呢我需要重点推荐的是微软云平台air上的设计模式,cloud design patterns.这个网站上罗列了分布式设计的各种设计模式啊,可以说是非常全面和完整的。
他对于每一个模式都有详细的说明,而且呢还有对他优缺点的讨论,还有适用场景和不适用场景的说明啊,实在是一个非常不错的学习分布式设计模式的地方。
它的分类呢包括可用性、数据管理、设计和实现消息管理和监控,性能和扩展,还有系统弹力和安全。
除此之外呢,还有其他的一些关于分布式系统设计模式的网站和相关的资料。
第一篇AWS cloud pattern,这里呢集集了AWS平平的一些设计模式,第二篇design patterns for container based distributy systems.那这个呢是google的一篇论文,那其中呢描述了容器化的分布式架构的设计模式。
第三篇patterns for distributy systems.那这个呢是一个PPT.那其中呢讲述了一些分布式系统的架构模式,你可以顺着呢到google里面去搜索。
我个人觉得呢微服也好,SUV也好,它们都是分布式系统的一部分。
所以这里呢有两个网站罗列了各种各样的服务架构模式啊,分别是paraton language for micro services和SOA patterns.当然啊还有我在极客时间上写的那些分布式的设计模式的总结。
在弹力设计篇呢,我讲了认识故障和弹力设计、隔离设计、异步通讯设计、密等型设计,还有服务的状态补偿事务、重试设计以及熔断设计、限流设计,同试设计而有弹力设计的总结。
而在管理设计篇当中呢,我讲了分布式锁配置中心、编车模式、服务网格网关模式,还有部署升级策略。
在性能设计篇里呢,我又讲了缓存、异步处理、数据库扩展、秒杀,还有边缘计算等等。
那谈拉的设计模式呢呃接着呢我们再来聊一聊设计与工程实践方面的内容。
首先是我对分布式系统的故障测试相关的一些推荐,第一篇叫做FIT viaser injection testing.那这个呢是netflix公司的一篇关于做故障注入测试的文章。
第二篇automated filure testing.那同样呢也是来自netflix公司自动化故障测试的一篇博文。
第三篇automating feather testing research had internet goal passion netflix公司和圣克鲁斯加利福尼亚大学还有游戏公司gramming一同撰写了一篇论文。
而对于弹性伸缩呢,我主要介绍下面这六篇文章。
第一篇four architecture issues when scaltting web applications quartneex database CPUIO.那这篇文章呢讲解了后端程序的主要性能指标啊,也就是响应时间和可伸缩性。
这两者如何能提高的解决方案。
它讨论的包括纵向和横向扩展、可伸缩架构、负载均衡数据库的伸缩CPU密集型和IO密集型程序的考量等等。
第二篇salred用siitful objects.那这个呢是一本叫做development and deploloment ment of multiplayer online games的书中一章内容的节选,他讨论了有状态和无状态的节点。
如何深索的问题啊,虽然还没有写完,但呢可以给你一些很不错的基本概念和想法。
第三篇scalala various scale out isn't cost是coding horror上的一篇有趣的文章,它详细分析了可伸缩性架构的不同扩展方案所带来的成本差异,帮助你更好的选择合理的扩展方案。
啊,可以看一看,第四篇叫做best practice for scheduling out,是open shift的一篇讨论scale out最佳实践的文章。
第五篇,scalability, worst practice.这篇文章讨论了一些最差的事件啊,你需要小心的避免第六篇ready lessons. Learn from mistakes may scaling to one billion page views a month.这个是redi it分享的一些关于系统扩展的经验教训。
除此之外,还有几篇关于自动化弹性伸缩的文章,我也在文中给你列了出来。
而对于一致性哈希呢,我推荐四篇文章,第一篇,consistent hashing.那这个呢是一个一致性哈希的简单教程,其中呢还有代码示例,第二篇consistent hashing over them in tradlfs.那这篇文章讲述了一致性哈希的一些缺陷和坑啊,还有各种哈希算法的性能比较。
最后呢还给了一组代码仓库,其中呢有各种哈希算法的实现。
第三篇,distributing content to open connect.它是netflix的一个对一致性哈希的实践啊,提出了uniform consistent、 hashing啊是挺有意思的。
一篇文章第四篇叫做consistent hashing in consenre.这个呢是consenga中使用到的一致性哈希的相关设计。
对于数据库分布式呢,我主要来介绍五篇文章。
第一篇life yond distribute transactions.这篇文章是sales box的软件架构师。
帕特赫兰德在二零一六年十二月发表的,他在二零零七年CIDR上就发表过一篇同名的文章啊,这个呢是他的更新和缩写版本。
业界在谈到分布式事务的时候呢,通常指的是两阶段提交负PC事务啊,或者taxas和raft.那这些事物呢都有明显的缺点和局限性。
而赫兰德在这篇文章中啊讨论的是另外一种基于本地事务情况下的事务机制。
它基于实体和活动的概念啊,其实类似于DED聚合根和领域事件的概念。
这种工作流类型的事物啊,虽然需要程序员来介入,依靠消息系统来实现,但是呢可以实现接近无限扩展的大型系统。
赫兰格在文中呢提出了一个重要的观点啊,就是如果你不能使用分布式事务,那么你就只能使用工作流。
第二篇how sharing works?这是一篇很不错的探讨数据sharing的文章。
那基本上来说啊,数据sharing可能的问题都在这篇文章里谈到了。
第三篇,why you don't want to shirt?这个是per的一篇文章,那其中呢表达了不到万不得已,不要做数据分片。
是的,最好呢还是先按业务来拆分,先把它做成微服务的架构,然后把把数据集变简单,然后再做沙掉呢会更好。
第四篇how to scare big data applications.这个呢也是per cora给出的一篇关于怎样给大数据应用做架构扩展的文章,值得一读。
第五篇mysql shuding with proxy circle,这是用proxy circle来支撑mysql数据分片的一篇实践文章。
那接下来对于缓存方面的内容呢,我推荐以下六篇文章,第一篇叫做缓存更新的套路啊,这是我在枯哨上写的缓存更新的几个设计模式,包括cache a site read right through her right behind casing,第二篇designer for modern cash.他总结了设计一个现代化的缓存系统需要注意到的东西。
第三篇,netflix cashing for global netflix,它是netflix公司的全局缓存架构实践。
第四篇facebook analysis of facebook for the castion是facebook公司的图片缓存使用分析。
那这篇文章呢挺有意思的,用数据来调优不同的缓存大小和算法。
第五篇和trivego reduced mam cash memory usage by fifty percent.这个呢是国公司的一篇分享,自己是如何把trabumam catch的内存使用率降了一半的实践性文章啊,很有意思,可以让你学到很多的东西。
第六篇开盛internal service calls of yp,讲的是亚普公司的缓存系统架构。
而关于消息队列方面呢,我推荐以下这些文章供你参考。
第一篇understanding when to use rabbit, MQ or a party kafkar什么时候用rabbit? Mq什么时候用kafka?通过这一篇文章,可以让你明白如何做技术决策。
第二篇travel why we choose kafka or travel socker architecture,这个呢是travel的卡架构分享。
第三篇,linkiting running kafka as scale,它是lincolling公司的卡夫卡架构扩展实践。
第四篇,should you put several even types in the same kafka topic?如果这个问题经常困扰你,这篇文章呢,可以为你找到答案。
第五篇billions of messages a day yip's real time data pipeline业务公司每天十亿级实时消息的架构。
第六篇uber building, reliable reprocessing and deadletter kills with caafka.这是uber公司的卡应用。
第七篇,uber introducing shukroom, how over engineering audience kafka and to end是uber公司对卡夫卡消息的端到端审计。
第八篇publishing呢is a party caafka at new york times,是纽约时报的卡普卡工程实践第九篇kafka dreams on尔库尔库公司的harharkafka dreams的实践。
第十篇salesforce, how a party caafcar inspiled our platform events architecture是salesforce的卡功能实践第十一篇exactly one symmatics are possible. Here's how cupker does it.怎样用coper让只发送一次的语义变为可能,这是业界中一个很难的工程问题。
第十二篇,delivering billions of message is exactly once,和前面一样,这也是一篇挑战。
消息。
只发送一次这个技术难题的文章。
第十三篇benchmark's smming computation landience of yahoo yahoo storm团队。
给他们的流式计算做技术选型的时候呢,发现市面上缺乏针对不同计算平台的性能基准测试。
于是呢他们研究并设计了一种方案来做基准测试,测试了party flink、 a party storm,还有a party spark.这三种平台。
文中呢给出了结论和具体的测试方案。
然后关于日志方面啊,我想和你分享三篇文章第一篇using logs to build a solid data infrastructure. Martin cleffman设计基于log结构应用架构的一篇不错的文章。
第二篇building distributed lock high performance, replicated lock service distribute lock是twitter在二零一六年五月份开展的一个分布式日志,系统在twitter内部呢已经使用了两年多。
它的主页呢是distribute lock到IO.这篇文章呢讲述了这个高性能日志系统的一些技术细节。
顺便呢提一句啊,他的技术负责人呢是个中国人。
他在微信公众号中呢也分享过这个系统叫做twitter高性能分布式日志系统架构简析第三篇lock device, a distribute data story. Flocks是facebook分布式日志系统方面的一些工程分享。
那接下来呢是关于性能方面,我想给你推荐五篇文章,第一篇叫做understand latency.这篇文章收集并整理了一些和系统响应时间相关的文章,它可以让你全面了解和linensy有关的系统架构和设计经验方面的知识。
第二篇common bottonecks文中呢讲述了二十个常见的系统瓶颈。
第三篇performance is a feature coding. Horror上的一篇让你关注性能的文章。
第四篇make performance part for your workload.这篇文章呢是图书designing for performance中的节选,那其中呢给出来了一些和性能有关的设计上的平衡和美学。
第五篇文章clouffair, we we build relilimiting capable of scaling two millions of domains.他讲述了劳尔公司是怎样实现他们的限流功能的。
他从最简单的每客户IP限流开始分析,进一步呢讲到了any cast.在这种情况下,POP的分布式限流是怎样实现的,并详细解释了具体的算法。
另外关于搜索方面的文章和各个公司的架构实践的相关说明。
我在文中呢都给你列了出来。
好了,这节课到这里呢就结束了。
我们来简单总结一下,今天我们分享的内容呢是高手成长篇分布式架构部分的最后一篇分布式架构工程设计,讲述了设计原则、设计模式等方面的内容,尤其整理和推荐了国内外知名企业的设计思路和工程实践,十分具有借鉴意义。
在下节课呢,我们将分享微服务架构方面的内容,敬请期待。