前言

咱们好,我是田螺

记住很久之前,去面试过字节跳动。被三面的面试官问了一道场景规划标题:怎么规划一个高并发体系。其时我回答得比较粗糙,最近回想起来,所以整理了规划高并发体系的15个锦囊,相信咱们看完会有帮助的。

字节三面:如何设计一个高并发系统

  • 公众号:捡田螺的小男孩
  • github地址,感谢每颗star:github

怎么理解高并发体系

所谓规划高并发体系,便是规划一个体系,保证它整体可用的同时,能够处理很高的并发用户恳求,能够承受很大的流量冲击

咱们要规划高并发的体系,那就需求处理好一些常见的体系瓶颈问题,如内存缺乏、磁盘空间缺乏,衔接数不行,网络宽带不行等等,以应对突发的流量洪峰。

1. 分而治之,横向扩展

假定你只布置一个运用,只布置一台服务器,那抗住的流量恳求对错常有限的。而且,单体的运用,有单点的风险,假定它挂了,那服务就不可用了。

因而,规划一个高并发体系,咱们能够分而治之,横向扩展。也便是说,选用散布式布置的办法,布置多台服务器,把流量分流开,让每个服务器都承当一部分的并发和流量,进步整体体系的并发才能

2. 微服务拆分(体系拆分)

要进步体系的吞吐,进步体系的处理并发恳求的才能。除了选用散布式布置的办法外,还能够做微服务拆分,这样就能够到达分摊恳求流量的意图,进步了并发才能。

所谓的微服务拆分,其实便是把一个单体的运用,按功用单一性,拆分为多个服务模块。比方一个电商体系,拆分为用户体系、订单体系、商品体系等等

字节三面:如何设计一个高并发系统

3. 分库分表

当事务量暴增的话,MySQL单机磁盘容量会撑爆。而且,咱们知道数据库衔接数是有限的。在高并发的场景下,大量恳求拜访数据库,MySQL单机是扛不住的!高并发场景下,会呈现too many connections报错。

所以高并发的体系,需求考虑拆分为多个数据库,来抗住高并发的毒打。而假定你的单表数据量非常大,存储和查询的功用就会遇到瓶颈了,假定你做了很多优化之后仍是无法进步效率的时分,就需求考虑做分表了。一般千万等级数据量,就需求分表,每个表的数据量少一点,进步SQL查询功用。

当面试官问要求你规划一个高并发体系的时分,一般都要提到分库分表这个点。

之前写了分库分表15连问,为了应对面试官追问到底,咱们能够趁便温习一下分库分表的相关经典面试题哈,能够看我这篇文章:分库分表经典15连问

4. 池化技能

在高并发的场景下,数据库衔接数或许成为瓶颈,由于衔接数是有限的。

咱们的恳求调用数据库时,都会先获取数据库的衔接,然后依托这个衔接来查询数据,搞完收工,最终关闭衔接,开释资源。假定咱们不必数据库衔接池的话,每次履行SQL,都要创建衔接和销毁衔接,这就会导致每个查询恳求都变得更慢了,相应的,体系处理用户恳求的才能就降低了。

因而,需求运用池化技能,即数据库衔接池、HTTP 衔接池、Redis 衔接池等等。运用数据库衔接池,能够避免每次查询都新建衔接,削减不必要的资源开销,经过复用衔接池,进步体系处理高并发恳求的才能

同理,咱们运用线程池,也能让使命并行处理,更高效地完结使命。咱们能够看下我之前线程池的这篇文章,到时分面试官问到这块时,刚好能够扩打开来讲

  • 面试必备:Java线程池解析
  • 细数线程池的10个坑

5. 主从别离

一般来说,一台单机的MySQL服务器,能够支撑500左右的TPS10000左右的QPS,即单机支撑的恳求拜访是有限的。因而你做了散布式布置,布置了多台机器,布置了主数据库、从数据库。

可是,假定双十一搞活动,流量肯定会猛增的。假定所有的查询恳求,都走主库的话,主库肯定扛不住,由于查询恳求量对错常非常大的。因而一般都要求做主从别离,然后实时性要求不高的读恳求,都去读从库,写的恳求或许实时性要求高的恳求,才走主库。这样就很好维护了主库,也进步了体系的吞吐。

当然,假定回答了主从别离,面试官或许扩打开问你主从复制原理,问你主从推迟问题等等,这块咱们需求全方位温习好哈。能够去看看我之前的这篇文章

面试必备:聊聊MySQL的主从

6. 运用缓存

无论是操作体系,浏览器,仍是一些杂乱的中间件,你都能够看到缓存的影子。咱们运用缓存,主要是进步体系接口的功用,这样高并发场景,你的体系就能够支撑更多的用户同时拜访。

常用的缓存包含:Redis缓存,JVM本地缓存,memcached等等。就拿Redis来说,它单机就能轻轻松松应对几万的并发,你读场景的事务,能够用缓存来抗高并发。

缓存虽然用得爽,可是要留意缓存运用的一些问题

  • 缓存与数据库的一致性问题
  • 缓存雪崩
  • 缓存穿透
  • 缓存击穿

假定咱们计划运用Redis的话,需求知道一些留意点,能够看下我之前的这篇文章哈,挺好的。运用Redis,你有必要知道的21个留意要点

7. CDN,加快静态资源拜访

商品图片,icon等等静态资源,能够对页面做静态化处理,削减拜访服务端的恳求。假定用户散布在全国各地,有的在上海,有的在深圳,地域相差很远,网速也各不相同。为了让用户最快拜访到页面,能够运用CDNCDN能够让用户就近获取所需内容。

什么是CDN?

Content Delivery Network/Content Distribution Network,翻译过来便是内容分发网络,它表示将静态资源分发到坐落多个地理位置机房的服务器,能够做到数据就近拜访,加快了静态资源的拜访速度,因而让体系更好处理正常其他动态恳求。

8. 音讯行列,削锋

咱们搞一些双十一、双十二等运营活动时,需求避免流量暴涨,打垮运用体系的风险。因而一般会引进音讯行列,来应对高并发的场景

字节三面:如何设计一个高并发系统

假定你的运用体系每秒最多能够处理2k个恳求,每秒却有5k的恳求过来,能够引进音讯行列,运用体系每秒从音讯行列拉2k恳求处理得了。

有些伙伴忧虑这样或许会呈现音讯积压的问题:

  • 首先,搞一些运营活动,不会每时每刻都那么多恳求过来你的体系(除非有人歹意进犯),高峰期曩昔后,积压的恳求能够渐渐处理;
  • 其次,假定音讯行列长度超过最大数量,能够直接抛弃用户恳求或跳转到过错页面;

9. ElasticSearch

Elasticsearch,咱们都运用得比较多了吧,一般查找功用都会用到它。它是一个散布式、高扩展、高实时的查找与数据分析引擎,简称为ES

咱们在聊高并发,为啥聊到ES呢? 由于ES能够扩容方便,天然支撑高并发。当数据量大的时分,不必动不动就加机器扩容,分库等等,能够考虑用ES来支撑简略的查询查找、计算类的操作。

10. 降级熔断

熔断降级是维护体系的一种手段。当时互联网体系一般都是散布式布置的。而散布式体系中偶尔会呈现某个根底服务不可用,最终导致整个体系不可用的状况, 这种现象被称为服务雪崩效应

比方散布式调用链路A->B->C....,下图所示:

字节三面:如何设计一个高并发系统

假定服务C呈现问题,比方是由于慢SQL导致调用缓慢,那将导致B也会推迟,从而A也会推迟。堵住的A恳求会耗费占用体系的线程、IO、CPU等资源。当恳求A的服务越来越多,占用计算机的资源也越来越多,最终会导致体系瓶颈呈现,形成其他的恳求相同不可用,最终导致事务体系崩溃。

为了应对服务雪崩, 常见的做法是熔断和降级。最简略是加开关操控,当下流体系出问题时,开关打开降级,不再调用下流体系。还能够选用开源组件Hystrix来支撑。

你要保证规划的体系能应对高并发场景,那肯定要考虑熔断降级逻辑进来。

11. 限流

限流也是咱们应对高并发的一种计划。咱们当然期望,在高并发大流量过来时,体系能悉数恳求都正常处理。可是有时分没办法,体系的CPU、网络带宽、内存、线程等资源都是有限的。因而,咱们要考虑限流。

假定你的体系每秒扛住的恳求是一千,假定一秒钟来了十万恳求呢?换个视点便是说,高并发的时分,流量洪峰来了,超过体系的承载才能,怎么办呢?

这时分,咱们能够采纳限流计划。便是为了维护体系,剩余的恳求,直接丢弃。

什么是限流:在计算机网络中,限流便是操控网络接口发送或接纳恳求的速率,它可避免DoS进犯和约束Web爬虫。限流,也称流量操控。是指体系在面临高并发,或许大流量恳求的状况下,约束新的恳求对体系的拜访,从而保证体系的稳定性。

能够运用GuavaRateLimiter单机版限流,也能够运用Redis散布式限流,还能够运用阿里开源组件sentinel限流。

面试的时分,你提到限流这块的话?面试官很大概率会问你限流的算法,因而,咱们在预备面试的时分,需求温习一下这几种经典的限流算法哈,能够看下我之前的这篇文章,面试必备:4种经典限流算法讲解

12. 异步

回忆一下什么是同步,什么是异步呢?以办法调用为例,它代表调用方要堵塞等候被调用办法中的逻辑履行完结。这种办法下,当被调用办法呼应时刻较长时,会形成调用方持久的堵塞,在高并发下会形成整体体系功用下降乃至发生雪崩。异步调用恰恰相反,调用方不需求等候办法逻辑履行完结就能够返回履行其他的逻辑,在被调用办法履行结束后再经过回调、事情告诉等办法将结果反馈给调用方。

因而,规划一个高并发的体系,需求在恰当的场景运用异步。怎么运用异步呢?后端能够借用音讯行列完成。比方在海量秒杀恳求过来时,先放到音讯行列中,快速相运用户,告知用户恳求正在处理中,这样就能够开释资源来处理更多的恳求。秒杀恳求处理完后,告诉用户秒杀抢购成功或许失败。

13. 惯例的优化

规划一个高并发的体系,需求规划接口的功用足够好,这样体系在相同时刻,就能够处理更多的恳求。当提到这里的话,咱们就能够跟面试官说说接口优化的一些计划了。咱们能够看下我的这篇文章哈:实战总结!18种接口优化计划的总结

字节三面:如何设计一个高并发系统

14. 压力测验确认体系瓶颈

规划高并发体系,离不开最重要的一环,便是压力测验。便是在体系上线前,需求对体系进行压力测验,测清楚你的体系支撑的最大并发是多少,确认体系的瓶颈点,让自己心里有底,最好预防措施。

压测完要分析整个调用链路,功用或许呈现问题是网络层(如带宽)、Nginx层、服务层、仍是数据路缓存等中间件等等。

loadrunner是一款不错的压力测验东西,jmeter则是接口功用测验东西,都能够来做下压测。

15. 应对突发流量峰值:扩容+切流量

假定是突发的流量高峰,除了降级、限流保证体系不跨,咱们能够选用这两种计划,保证体系尽或许服务用户:

  • 扩容:比方添加从库、进步配置的办法,进步体系/组件的流量承载才能。比方添加MySQL、Redis从库来处理查询恳求。
  • 切流量:服务多机房布置,假定高并发流量来了,把流量从一个机房切换到另一个机房。

参阅与感谢

  • 极客时刻高并发体系规划 40 问