亿级流量网站架构核心技术——跟开涛学搭建高可用高并发系统(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-19 12:01:25

点击下载

作者:张开涛

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

亿级流量网站架构核心技术——跟开涛学搭建高可用高并发系统

亿级流量网站架构核心技术——跟开涛学搭建高可用高并发系统试读:

前言

为什么要写这本书

在2011年年底的时候笔者就曾规划写一本Spring的书,但是因为是Spring入门类型的书,框架的内容更新太快,觉得还是写博客好一些,因此就把写完的书稿《跟我学Spring》放到了博客(jinnianshilongnian.iteye.com,因为是龙年开的博客,很多网友喊我龙年兄)中,并持续更新,到现在已经差不多五年了。大家在网上找资源时会发现,很多内容不成体系,不能用来系统地学习,这也是我曾经的痛点,因此我写博客的一个特色就是坚持写系列文章——想学习某种技术只要我的博客有就不需要去其他地方再找了,到现在已经写过《跟我学Spring》、《Spring杂谈》、《跟我学Spring MVC》、《跟我学Shiro》、《跟我学Nginx+Lua》等系列,累计访问量已超过1000万。我写博客还有一个私心:带新人,当时我们系统架构使用OpenResty,而团队成员都是Java程序员,所以就写了《跟我学OpenResty(Nginx+Lua)开发》,新人跟着教程学一遍就能上手干活了。扫一扫关注我的博客。

2015年开始,笔者在个人公众号“开涛的博客”撰写《聊聊高并发系统》系列文章,陆续发表了《聊聊高并发系统之限流特技》、《聊聊高并发系统之降级特技》、《聊聊高并发系统之队列术》、《构建需求响应式亿级商品详情页》等文章。这些内容都是笔者在一线使用过的一些技能,而这些技能又是一线程序员或架构师应该掌握的必备技能。而且这一系列也得到了很多读者的反馈和认可,帮助他们解决了系统的一些问题。公众号发表的有些内容偏理论,很多人不知道怎么去用,因此就有了丰富理论和实战内容并出版本书的想法。想学习高可用和高并发系统技能,看这本书就够了,并且可以作为案头工具书来用。

笔者耗费了大半年业余时间才成就此书,希望这些实战中能真地用得上的技术可以帮助到读者。

本书讲解的原则并不是笔者总结出来的,有许许多多前辈们已经实践过,笔者只是花了点时间进行汇总,并把工作中使用过的一些经验和案例融入到书中。

成长和进步是一个循序渐进的过程,妄图看完本书后能屠龙降魔是不可能的,别人走过的路还是会走一遍,别人踩过的坑还是会踩一遍。正如作家格拉德威尔在《异类:不一样的成功启示录》一书中的一万小时定律:“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。一万小时的锤炼是任何人从平凡变成世界级大师的必要条件”。

读者对象

本书希望对在一线从事开发工作或正在解决一线问题的朋友有所帮助。

如何阅读本书

本书的内容是理论与实战相结合,涉及的知识点比较多,共分为4个部分,读者可按照任何顺序阅读每一个部分,但建议先阅读第1部分进行系统了解。

第1部分概述,主要介绍开发高并发系统的一些原则,并阐述本书将要讲解的原则。

第2部分高可用,帮助读者理解高可用的一些原则,如负载均衡、限流、降级、隔离、超时与重试、回滚机制、压测与预案等,并能实际应用到自己的系统中。

第3部分高并发,介绍开发高并发系统的一些原则,如缓存、池化、异步化、扩容、队列等,并配合大量案例帮助读者更好地掌握和运用。

第4部分案例,介绍笔者开发过的商品详情页、统一服务等系统架构,还有一些静态化架构的思路,帮助读者理解前边介绍的一些原则。

阅读本书需要对Java、OpenResty(Nginx+Lua)、Redis、MysQl等技术有一定了解,OpenResty可以参考我的博客中的《跟我学OpenResty(Nginx+Lua)开发》系列文章。本文提到的Nginx+Lua等同于OpenResty。可扫码阅读《跟我学OpenResty(Nginx+Lua)开发》。

因为篇幅原因,本书示例很难做到全面且详细,因此思路不要受限于书中所写,要活学活用,举一反三。比如多级缓存的思路,可以扩展到多级存储:内存→NVMe/SATA SSD→机械盘。

勘误和支持

由于笔者能力有限,虽然找了很多朋友帮忙校对,但书中难免会出现一些错误,也请读者朋友批评指正。大家可以扫如下二维码关注我的公众号或者访问我的博客留言反馈错误和建议,笔者会积极提供解答。

致谢

首先要感谢进入京东商城时的架构组的同事们,感谢隋剑峰、邹开红、冯培源、李尊敬、徐涛、杨超、王战兵、赵辉、孙炳蔚等对我的帮助,也感谢杨思勇、尚鑫、徐烁、韩笑跃等对我的信任,并给了我大胆实践商城单品页的机会,还有我的好搭档刘峻桦,还有王晓钟、刘海峰、林世洪、肖飞、何小锋、鲍永成、刘行、周昱行等对我的帮助和支持,感谢我的领导徐春俊、杨建对我的支持和肯定,感谢京东和我的团队,还有许许多多一起合作过和交流过的朋友们,没有你们的帮助就没有这本书的出版。

感谢张志统、肖飞、赵云霄、马顺风、刘兵、张亮、颜晟、曾波、孙伟、王景、黄杨俊、王君富、李晋、刘嘉南、刘艺飞、吴正轩、邵东风、孙鹏、张金立、任敬表、刘冉、陈玉苗、王晓雯、李乐伟、晁志刚、王向维、赵湘建、尤凤凯等对本书的校对和建议。感谢林世洪、肖飞、赵云霄为本书提供素材。也感谢那些在我博客和公众号留言和鼓励我的朋友,最后感谢电子工业出版社的侠少和杨璐的支持。

读者服务

轻松注册成为博文视点社区用户(www.broadview.com.cn),您即可享受以下服务:

· 下载资源:本书所提供的示例代码及资源文件均可在【下载资源】处下载。

· 提交勘误:您对书中内容的修改意见可在【提交勘误】处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

· 与作者交流:在页面下方【读者评论】处留下您的疑问或观点,与作者和其他读者一同学习交流。

页面入口:http://www.broadview.com.cn/30954

二维码:第1部分概述· 高并发原则· 高可用原则· 业务设计原则· 总结1 交易型系统设计的一些原则

在我们的技术生涯中,总是不断针对新的需求去研发新的系统,而很多系统的设计都是可以触类旁通的。在设计系统时,要因场景、时间而异,一个系统也不是一下子就能设计得非常完美,在具有有限资源的情况下,一定是先解决当下最核心的问题,预测并发现未来可能出现的问题,一步步解决最痛点的问题。也就是说,系统设计是一个不断迭代的过程,在迭代中发现问题并修复问题,即满足需求的系统是不断迭代优化出来的,这是一个持续的过程,个人不相信完美架构银弹。不过,如果一开始就有好的基础系统设计,未来可以更容易达到一个比较满意的目标。一个好的设计要做到,解决现有需求和问题,把控实现和进度风险,预测和规划未来,不要过度设计,从迭代中演进和完善。

在设计系统时,应该多思考墨菲定律。

1.任何事都没有表面看起来那么简单。

2.所有的事都会比你预计的时间长。

3.可能出错的事总会出错。

4.如果你担心某种情况发生,那么它就更有可能发生。

在系统划分时,也要思考康威定律。

1.系统架构是公司组织架构的反映。

2.应该按照业务闭环进行系统拆分/组织架构划分,实现闭环/高内聚/低耦合,减少沟通成本。

3.如果沟通出现问题,那么就应该考虑进行系统和组织架构的调整。

4.在合适时机进行系统拆分,不要一开始就把系统/服务拆得非常细,虽然闭环,但是每个人维护的系统多,维护成本高。

应该多鼓励团队成员积极主动沟通并推动系统演进。另外,也要多思考二八定律,在系统设计初期将有限的资源用到刀刃上,以最小化可行产品方式迭代推进。

在持续开发系统的过程中,会有一些设计原则/经验可以用来遵循和指导我们。但设计原则应该在系统迭代过程中,根据现有问题或特征匹配使用,如果刚开始遇到的不是核心问题,那么不要复杂化系统设计,但先行规划和设计是有必要的,要对现有问题有方案,对未来架构有预案。1.1 高并发原则1.1.1 无状态

如果设计的应用是无状态的,那么应用比较容易进行水平扩展。实际生产环境可能是这样的:应用无状态,配置文件有状态。比如,不同的机房需要读取不同的数据源,此时,就需要通过配置文件或配置中心指定。1.1.2 拆分

在系统设计初期,是做一个大而全的系统还是按功能模块拆分系统,这个需要根据环境进行权衡。比如,做私塾在线时,本身用户量/交易量不会特别大,开发就笔者一个人,资源有限,那就没必要对系统拆分(比如,拆分商品、订单等),做一个大而全的系统即可。而像设计京东秒杀系统,访问量是非常大的,而且投入的资源还是蛮充足的,在这种情况下,就可以考虑按功能拆分系统。

笔者遇到的拆分主要有如下几种情况。

系统维度:按照系统功能/业务拆分,比如商品系统、购物车、结算、订单系统等。

功能维度:对一个系统进行功能再拆分,比如,优惠券系统可以拆分为后台券创建系统、领券系统、用券系统等;

读写维度:根据读写比例特征进行拆分。比如,商品系统,交易的各个系统都会读取数据,读的量大于写,因此可以拆分成商品写服务、商品读服务;读服务可以考虑使用缓存提升性能;写的量太大时,需要考虑分库分表;有些聚合读取的场景,如商品详情页,可考虑数据异构拆分系统,将分散在多处的数据聚合到一处存储,以提升系统的性能和可靠性;

AOP维度:根据访问特征,按照AOP进行拆分,比如,商品详情页可以分为CDN、页面渲染系统;CDN就是一个AOP系统。

模块维度:比如,按照基础或者代码维护特征进行拆分,如基础模块分库分表、数据库连接池等;代码结构一般按照三层架构(Web、Service、DAO)进行划分。1.1.3 服务化

首先,判断是不是只需要简单的单点远程服务调用,单机不行集群是不是就可以解决?在客户端注册多台机器并使用Nginx进行负载均衡是不是就可以解决?随着调用方越来越多,应该考虑使用服务自动注册和发现(如Dubbo使用ZooKeeper)。其次,还要考虑服务的分组/隔离,比如,有的系统访问量太大,导致把整个服务打挂,因此,需要为不同的调用方提供不同的服务分组,隔离访问。后期随着调用量的增加还要考虑服务的限流、黑白名单等。还有一些细节需要注意,如超时时间、重试机制、服务路由(能动态切换不同的分组)、故障补偿等,这些都会影响到服务的质量。

总结为:进程内服务→单机远程服务→集群手动注册服务→自动注册和发现服务→服务的分组/隔离/路由→服务治理如限流/黑白名单。1.1.4 消息队列

消息队列是用来解耦一些不需要同步调用的服务或者订阅一些自己系统关心的变化。使用消息队列可以实现服务解耦(一对多消费)、异步处理、流量削峰/缓冲等。比如,电商系统中的交易订单数据,该数据有非常多的系统关心并订阅,比如,订单生产系统、定期送系统、订单风控系统等等。如果订阅者太多,那么订阅单个消息队列就会成为瓶颈,此时,需要考虑对消息队列进行多个镜像复制。

使用消息队列时,还要注意处理生产消息失败,以及消息重复接收时的场景。有些消息队列产品会提供生产重试功能,在达到指定重试次数还未生产成功时,会对外通知生产失败。这时,对于不能容忍生产失败的业务场景来说,一定要做好后续的数据处理工作,如持久化数据要同时增加日志、报警等。对于消息重复问题,特别是一些分布式消息队列,出于对性能和开销的考虑,在一些场景下会发生消息重复接收,需要在业务层面进行防重处理。

1.大流量缓冲

在电商搞大促时,系统流量会高于正常流量的几倍甚至几十倍,此时就要进行一些特殊的设计来保证系统平稳度过这段时期;而解决的手段很多,一般都是牺牲强一致性,而保证最终一致性即可。

比如,扣减库存,可以考虑这样设计。

直接在Redis中扣减,然后记录下扣减日志,通过Worker同步到DB。

还有,如交易订单系统,可以考虑这样设计。

首先,结算服务调用订单接单服务,将订单存储到订单Redis和订单队列表,订单队列表可以按照需求水平扩展多个表,通过队列缓冲表提升接单能力。然后,通过同步Worker同步到订单中心表;假设用户支付了订单,订单状态机会驱动状态变更,此时,可能订单队列表的订单还没有同步到订单中心表,状态机要根据实际情况进行重试。

如果用户查看单个订单详情,那么可以直接从订单Redis中查到。但如果查询订单列表,则需要考虑订单Redis和列表的合并。

同步Worker在设计时,需要考虑并发处理和重复处理的问题,比如,使用单机串行扫描处理(每台Worker只扫描其中的一部分表)还是集群处理(Map-Reduce)。另外,需要考虑是否需要对订单队列表添加相关字段:处理人(哪个应用正在处理)和处理状态(正在处理、已处理、处理失败)、最后处理时间(应对超时)、失败次数等。

2.数据校对

在使用了消息异步机制的场景下,可能存在消息的丢失,需要考虑进行数据校对和修正来保证数据的一致性和完整性。可以通过Worker定期去扫描原始表,通过对业务数据进行校对,有问题的要进行补偿,扫描周期根据实际场景进行定义。1.1.5 数据异构

1.数据异构

订单分库分表一般按照订单ID进行分,如果要查询某个用户的订单列表,则需要聚合多个表的数据后才能返回,这样会导致订单表的读性能很低。此时需要对订单表进行异构,异构一套用户订单表,按照用户ID进行分库分表。另外,还需要考虑对历史订单数据进行归档处理,以提升服务的性能和稳定性。而有些数据异构的意义不大,如库存价格,可以考虑异步加载,或者合并并发请求。

2.数据闭环

数据闭环如商品详情页,因为数据来源太多,影响服务稳定性的因素就非常多了。因此,最好的办法是把使用到的数据进行异构存储,形成数据闭环,基本步骤如下。

· 数据异构:通过如MQ机制接收数据变更,然后原子化存储到合适的存储引擎,如Redis或持久化KV存储。

· 数据聚合:这步是可选的,数据异构的目的是把数据从多个数据源拿过来,数据聚合的目的是把这些数据做个聚合,这样前端就可以一个调用拿到所有数据,此步骤一般存储到KV存储中。

· 前端展示:前端通过一次或少量几次调用拿到所需要的数据。

这种方式的好处就是数据的闭环,任何依赖系统出问题了,还是能正常工作,只是更新会有积压,但是不影响前端展示。

另外,此处如果一次需要多个数据,那么可以考虑使用Hash Tag机制将相关的数据聚合到一个实例,如在展示商品详情页时需要商品基本信息“p:productId:”和商品规格参数“d:productId:”,此时就可以使用冒号中间的productId作为数据分片key,这样相同productId的商品相关数据就在一个实例。

数据闭环和数据异构其实是一个概念,目的都是实现数据的自我控制,当其他系统出问题时不影响自己的系统,或者自己出问题时不影响其他系统。一般通过消息队列来实现数据分发。1.1.6 缓存银弹

缓存对于读服务来说可谓抗流量的银弹,可总结为下表。本表由林世洪提供。

1.浏览器端缓存

设置请求的过期时间,如对响应头Expires、Cache-control进行控制。这种机制适用于对实时性不太敏感的数据,如商品详情页框架、商家评分、评价、广告词等;但对于价格、库存等实时要求比较高的数据,就不能做浏览器端缓存。

2.APP客户端缓存

在大促时为了防止瞬间流量冲击,一般会在大促之前把APP需要访问的一些素材(如js/css/image等)提前下发到客户端进行缓存,这样在大促时就不用去拉取这些素材了。还有如首屏数据也可以缓存起来,在网络异常情况下还是有托底数据给用户展示;还有如APP地图一般也会做地图的离线缓存。

3.CDN缓存

有些页面、活动页、图片等服务可以考虑将页面、活动页、图片推送到离用户最近的CDN节点,让用户能在离他最近的节点找到想要的数据。一般有两种机制:推送机制(当内容变更后主动推送到CDN边缘节点)和拉取机制(先访问边缘节点,当没有内容时,回源到源服务器拿到内容并存储到节点上),两种方式各有利弊。使用CDN时要考虑URL的设计,比如URL中不能有随机数,否则每次都穿透CDN回源到源服务器,相当于CDN没有任何效果。对于爬虫,可以返回过期数据而选择不回源。

4.接入层缓存

对于没有CDN缓存的应用来说,可以考虑使用如Nginx搭建一层接入层,该接入层可以考虑使用如下机制实现。

· URL重写:将URL按照指定的顺序或者格式重写,去除随机数。

· 一致性哈希:按照指定的参数(如分类/商品编号)做一致性Hash,从而保证相同数据落到一台服务器上。

· proxy_cache:使用内存级/SSD级代理缓存来缓存内容。

· proxy_cache_lock:使用lock机制,将多个回源合并为一个,以减少回源量,并设置相应的lock超时时间。

· shared_dict:如果架构使用了nginx+lua实现,则可以考虑使用lua shared_dict进行cache,最大的好处就是reload缓存不会丢失。

此处要注意,对于托底(或兜底,指降级后显示的)数据或异常数据,不应该让其缓存,否则用户会在很长一段时间里看到这些数据。

5.应用层缓存

我们使用Tomcat时,可以使用堆内缓存/堆外缓存,堆内缓存的最大问题就是重启时内存中的缓存会丢失,此时流量风暴来临,则有可能冲垮应用;还可考虑使用local redis cache来代替堆外内存;或在接入层使用shared_dict来将缓存前置,以减少风暴。

local redis cache,通过在应用所在服务器上部署一组Redis,应用直接读本机Redis获取数据,多机之间使用主从机制同步数据。这种方式没有网络消耗,性能是最优的。

6.分布式缓存

有一种机制是要废弃分布式缓存,改成应用local redis cache情况下,如果数据量不大,这种架构是最优的。但是如果数据量太大,单服务器存储不了,那么可以使用分片机制将流量分散到多台,或者直接用分布式缓存实现。常见的分片规则就是一致性哈希了。

如上图所示就是我们一个应用的架构。

· 首先接入层(nginx+lua)读取本地proxy cache / local cache。

· 如果不命中,则接入层会接着读取分布式Redis集群。

· 如果还不命中,则会回源到Tomcat,然后读取Tomcat应用堆内cache。

· 如果缓存都没命中,则调用依赖业务来获取数据,然后异步化写到Redis集群。

因为我们使用了nginx+lua,第二、三步时可使用lua-resty-lock非阻塞锁减少峰值时的回源量;如果你的服务是用户维度的,那么这种非阻塞锁大部分情况下不会有太大作用(要看具体场景)。1.1.7 并发化

假设一个读服务需要如下数据。

如果串行获取,那么需要60ms。

而如果数据C依赖数据A和数据B、数据D谁也不依赖、数据E依赖数据C,那么我们可以这样来获取数据。

如果并发化获取,则需要30ms,能提升一倍的性能。

假设数据E还依赖数据F(5ms),而数据F是在数据E服务中获取的,此时,就可以考虑在此服务中取数据A/B/D时,预取数据F,那么整体性能就变为25ms。1.2 高可用原则1.2.1 降级

对于一个高可用服务,很重要的一个设计就是降级开关,在设计降级开关时,主要依据如下思路。

1.开关集中化管理:通过推送机制把开关推送到各个应用。

2.可降级的多级读服务:比如服务调用降级为只读本地缓存、只读分布式缓存、只读默认降级数据(如库存状态默认有货)。

3.开关前置化:如架构是Nginx→Tomcat,可以将开关前置到Nginx接入层,在Nginx层做开关,请求流量回源后端应用或者只是一小部分流量回源。

4.业务降级:当高并发流量来袭,在电商系统大促设计时保障用户能下单、能支付是核心要求,并保障数据最终一致性即可。这样就可以把一些同步调用改成异步调用,优先处理高优先级数据或特殊特征的数据,合理分配进入系统的流量,以保障系统可用。1.2.2 限流

限流的目的是防止恶意请求流量、恶意攻击,或者防止流量超出系统峰值。可以考虑如下思路。

1.恶意请求流量只访问到cache。

2.对于穿透到后端应用的流量可以考虑使用Nginx的limit模块处理。

3.对于恶意IP可以使用nginx deny进行屏蔽。

原则是限制流量穿透到后端薄弱的应用层。1.2.3 切流量

对于一个大型应用,切流量是非常重要的,比如多机房环境下某个机房挂了,或者某个机架挂了,或者某台服务器挂了,都需要切流量,可以使用如下手段进行切换。

1.DNS:切换机房入口。

2.HttpDNS:主要APP场景下,在客户端分配好流量入口,绕过运营商LocalDNS并实现更精准流量调度。

3.LVS/HaProxy:切换故障的Nginx接入层。

4.Nginx:切换故障的应用层。

另外,有些应用为了更方便切换,还可以在Nginx接入层做切换,通过Nginx进行一些流量切换,而没有通过如LVS/HaProxy做切换。1.2.4 可回滚

版本化的目的是实现可审计可追溯,并且可回滚。当程序或数据出错时,如果有版本化机制,那么就可以通过回滚恢复到最近一个正确的版本,比如事务回滚、代码库回滚、部署版本回滚、数据版本回滚、静态资源版本回滚等。通过回滚机制可保证系统某些场景下的高可用。

本书将介绍通过负载均衡和反向代理实现分流,通过限流保护服务免受雪崩之灾,通过降级实现部分可用、有损服务,通过隔离实现故障隔离,通过设置合理的超时与重试机制避免请求堆积造成雪崩,通过回滚机制快速修复错误版本。上述原则用来保护系统,往往能实现系统高可用。1.3 业务设计原则

这些原则本书只进行简单介绍,不会展开讲解,大家可以自行研究学习。1.3.1 防重设计

比如,结算页需要考虑重复提交,还有如下单扣减库存时需要防止重复扣减库存。解决方案可以考虑防重key、防重表。而有些场景如重复支付,是因为有的电商网站同时支持微信支付、京东支付,渠道不一样是无法防止重复支付的。但是,在系统设计时,需要将支付的每笔情况记录下来。下图是笔者在京东使用京东支付和微信支付模拟的重复支付之后进行退款的支付明细。1.3.2 幂等设计

在交易系统中,经常会用到消息,而现有消息中间件基本不保证不发生重复消息的消费。因此,需要业务系统在重复消息消费时进行幂等处理。还有在使用第三方支付时,第三方支付会进行异步回调,也要考虑做好回调的幂等处理。1.3.3 流程可定义

如果接触过保险业务,就会发现不同保险的理赔服务是不一样的。我们在系统设计时就设计了一套理赔流程服务。而承保流程和理赔流程是分离的,在需要时进行关联,从而可以复用一些理赔流程,并提供个性化的理赔流程。1.3.4 状态与状态机

在设计交易订单系统时,会存在正向状态(待付款、待发货、已发货、完成)和逆向状态(取消、退款)等,正向状态和逆向状态应该根据系统的特征来决定要不要分离存储。状态设计时应有状态轨迹,方便用户跟踪当前订单的轨迹并记录相关日志,万一出问题时可回溯问题。

另外,还有订单状态的变迁,比如待支付、已支付待发货、待收货、完成的迁移。要考虑要不要使用状态机来驱动状态的变更和后续流程节点操作,尤其当状态很多的时候使用状态机能更好地控制状态迁移。

还要考虑并发状态修改问题,如一个订单同时只能有一个修改;状态变更的有序问题,以及状态变更消息的先到后到问题,如支付成功消息和用户取消消息的时间差。1.3.5 后台系统操作可反馈

在笔者接触过的系统中,很多场景都需要反馈,比如,修改了某些内容后想预览看看最终效果,即想得到一些反馈;还有一些是在规则系统中,希望看到这些规则在系统数据下的反馈。因此,在设计后台系统时,需考虑效果的可预览、可反馈。1.3.6 后台系统审批化

对于有些重要的后台功能需要设计审批流,比如调整价格,并对操作进行日志记录,从而保证操作可追溯、可审计。1.3.7 文档和注释

笔者接触的一些系统是完全没有文档、代码没有注释的,完全是人传人。这将导致后来人接手很痛苦,而且对有些代码是完全不敢改动的,比如,有些代码完全是因为业务的一些特殊情况而写的,可以说没有注释是完全不懂为什么那么做的。因此,在一个系统发展的一开始就应该有文档库(设计架构、设计思想、数据字典/业务流程、现有问题),业务代码和特殊需求都要有注释。1.3.8 备份

包括代码和人员。代码主要提交到代码仓库进行管理和备份,代码仓库应该至少具备多版本的功能。人员备份指的是一个系统至少应该有两名开发人员是了解的,即使其中一名离职了也不会出现新人接手之后手忙脚乱事故频发的状况。还有一些是“核心人员”,写着系统的核心代码,被认为是“不可替代的”,这种情况也是尽可能地让他带一名兄弟一起开发核心代码(业务系统),即使离职也还是可以努力一下克服困难。1.4 总结

对于一个系统设计来说,不仅需要考虑实现业务功能,还要保证系统高并发、高可用、高可靠等。在系统容量规划(流量、容量等)、SLA制定(吞吐量、响应时间、可用性、降级方案等)、压测方案(线上、线上等)、监控报警(机器负载、响应时间、可用率等)、应急预案(容灾、降级、限流、隔离、切流量、可回滚等)等方面,也要有一些原则来指导大家。其中,每一个方向都是很复杂的,为了能讲解地较为深入,本书将从高并发和高可用两个方面来讲解,并配合案例实战使读者能参考案例,来理解这些原则并解决系统痛点。

本书将介绍缓存、异步并发、连接池、线程池、如何扩容、消息队列、分布式任务等高并发原则来提升系统吞吐量。

本书将介绍通过负载均衡和反向代理实现分流,通过限流保护服务免受雪崩之灾,通过降级实现部分可用、有损服务,通过隔离实现故障隔离,通过设置合理的超时与重试机制避免请求堆积造成雪崩,通过回滚机制快速修复错误版本;通过上述原则来保护系统,使得系统高可用。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载