如何设计一个高并发系统,这篇文章告诉你

基本概念

什么是高并发系统,就是一个能够保证整体可用的系统,能够处理很高的并发用户请求,能够承担很大的流量冲击。

设计一个高并发系统,需要处理好一些系统瓶颈,比如说磁盘空间问题、内存是否充足、网络带宽是否够、连接数是否够。

设计一个高并发系统可以考虑以下十几种方法。

高并发系统设计.png

微服务拆分

为了提高系统的吞吐量、提高系统的处理并发请求的能力,可以做微服务拆分,这样可以分摊请求流量,提高并发能力。

微服务拆分,是把一个单体的应用按功能单一性拆分为多个服务模块。比如一个电商系统,拆分为商品系统、用户系统、订单系统等。

分布式部署

如果只部署一台服务器,那抗住的流量请求是很有限的,单体的应用如果挂了,那服务就不可用了。

设计一个高并发系统,可以分而治之横向扩展,采用分布式部署,部署多台服务器,每个服务器都承担一部分的并发和流量。

使用缓存

使用缓存的目的主要是提高系统接口的性能。这样的话高并发场景,你的系统就可以支持更多的用户同时访问。

常用的缓存技术有Redis、memcached等等。比如就拿Redis来说,Redis单机轻轻松松应对几万的并发请求,对于读场景的业务就可以用缓存来抗高并发。

使用缓存,但是要注意一些问题:

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

池化

在高并发的场景下,因为连接数是有限的,数据库连接数可能会成为瓶颈。

我们的请求调用数据库时,都会先获取数据库的连接,然后依靠这个连接来查询数据,搞完收工,最后关闭连接,释放资源。如果我们不用数据库连接池的话,每次执行SQL,都要创建连接和销毁连接,这就会导致每个查询请求都变得更慢了。相应的系统处理用户请求的能力就降低了。

因此,需要使用池化技术,即数据库连接池、Redis 连接池、HTTP连接池、等等。使用数据库连接池,可以避免每次查询都新建连接,减少不必要的资源开销,通过复用连接池,提高系统处理高并发请求的能力。

另外,使用线程池也能让任务并行处理,高效地完成任务。

分库分表

当业务量暴增的话,MySQL单机磁盘容量会撑爆。并且,我们知道数据库连接数是有限的。在高并发的场景下,大量请求访问数据库,MySQL单机是扛不住的。高并发场景下,会出现太多连接的报错。

所以高并发的系统,需要考虑拆分为多个数据库,来抗住高并发。假如你的单表数据量非常大,存储和查询的性能就会遇到瓶颈了,如果你做了很多优化之后还是无法提升效率的时候,就需要考虑做分表了。一般千万级别数据量,就需要分表,每个表的数据量少一点,提升SQL查询性能。

主从分离

一台单机的MySQL服务器,可以支持500左右的TPS和10000左右的QPS,即单机支撑的请求访问是有限的。因此可以做分布式部署,部署多台机器,部署主数据库、从数据库。

但是因为查询请求量是非常大的,如果所有的查询请求,都走主库的话,主库肯定扛不住,因此一般都要求做主从分离。对实时性要求不高的读请求,都去读从库,写请求或者实时性要求高的请求走主库。这样就很好保护了主库,也提高了系统的吞吐。

CDN

图片等静态资源,可以做静态处理,减少访问服务端的请求。如果用户分布在全国各地,地域相差很远,网速也各不相同。为了让用户最快访问到页面,可以使用CDN。

CDN的全称是Content Delivery Network/Content Distribution Network,翻译过来就是内容分发网络,CDN可以让用户就近获取所需内容,它表示将静态资源分发到位于多个地理位置机房的服务器,可以做到数据就近访问,加速了静态资源的访问速度,因此让系统更好处理别的动态请求。

限流

限流也是应对高并发的一种方案。在高并发大流量过来时,有时候没办法,系统的CPU、网络带宽、内存、线程等资源都是有限的。因此我们要考虑限流。

如果你的系统每秒扛住的请求是一千,如果一秒钟来了十万请求呢?高并发的时候,流量洪峰来了,可以采取限流方案。保护了系统,多余的请求直接丢弃。

限流是控制网络接口发送或接收请求的速率,是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。

可以使用Redis分布式限流,也可以使用Guava的RateLimiter单机版限流,还可以开源组件sentinel限流。

异步

什么是同步,什么是异步呢?以方法调用为例,它代表调用方要阻塞等待被调用方法中的逻辑执行完成。这种方式下,当被调用方法响应时间较长时,会造成调用方长久的阻塞,在高并发下会造成整体系统性能下降甚至发生雪崩。异步调用恰恰相反,调用方不需要等待方法逻辑执行完成就可以返回执行其他的逻辑,在被调用方法执行完毕后再通过回调、事件通知等方式将结果反馈给调用方。

因此,设计一个高并发的系统,需要在恰当的场景使用异步。如何使用异步呢?后端可以借用消息队列实现。比如在大量请求过来时,先放到消息队列中,快速响应用户,告诉用户请求正在处理中,这样就可以释放资源来处理更多的请求。请求处理完后,通知用户成功或者失败。

接口优化

比如说批量操作、线程池、SQl优化、异步等等。

ElasticSearch

一般搜索功能都会用到ElasticSearch,ElasticSearch是一个高扩展、高实时、分布式的搜索与数据分析引擎,简称为ES。

ES扩容方便,天然支撑高并发。当数据量大的时候,不用动不动就加机器扩容,分库等等,可以考虑用ES来支持简单的查询搜索、统计类的操作。

降级熔断

熔断降级是保护系统的一种手段。当前互联网系统一般都是分布式部署的。而分布式系统中偶尔会出现某个基础服务不可用,最终导致整个系统不可用的情况, 这种现象被称为服务雪崩。

应对服务雪崩, 常见的做法是熔断和降级。最简单的做法是加开关控制,当下游系统出问题时,开关打开降级,不再调用下游系统。还可以选用开源组件Hystrix。

应对突发流量峰值

应对突发的流量高峰,除了降级和限流,我们还可以采用下面这两种方案:

扩容:比如增加从库、提升配置的方式,提升系统/组件的流量承载能力。比如增加MySQL、Redis从库来处理查询请求。

切换流量:服务多机房部署,如果高并发流量来了,把流量从一个机房切换到另一个机房。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值