文章目录
一、什么是高并发?
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一。当多个进程或线程同时(或着说在同一段时间内)访问同一资源时会产生并发问题,因此需要通过专门的设计来保证系统能够同时(并发)正确处理多个请求。举个小例子,例如当下课了,大伙一起冲出教室的门去食堂抢饭,但是教室的后面锁着,大家只能从前门走,这时候就可能会造成堵塞等情况。但是如果后门打开了,而且窗户也打开了 ,大伙就可以有的从后面走,有的跳窗走等等,都能去食堂打到饭的情况就是高并发。
二、什么是高性能?
高性能(High Performance)就是指程序处理速度快、耗能少。与性能相关的一些指标如下:
- 响应时间:系统对请求做出响应的时间。例如系统处理一个 HTTP 请求需要 200ms,这个 200ms 就是系统的响应时间。
- 吞吐量:单位时间内处理的请求数量。
- TPS:每秒响应事务数。
- 并发用户数:同时承载能正常使用系统功能的用户数量。
三、什么是高可用
通常用来描述一个系统经过专门的设计,从而减少停工时间,保证服务的持续可用。
四、如何有效实现高并发
1.垂直方向扩展,也叫竖向扩展
垂直方向:提升单机能力
提升单机处理能力又可分为硬件和软件两个方面:
- 硬件方向,很好理解,花钱升级机器,更多核更高主频更大存储空间更多带宽
- 软件方向,包括用各快的数据结构,改进架构,应用多线程、协程,以及上性能优化各种手段
2.水平方向扩展,也叫横向扩展
水平方向:分布式集群
为了解决分布式系统的复杂性问题,一般会用到架构分层和服务拆分,通过分层做隔离,通过微服务解耦。
这个理论上没有上限,只要做好层次和服务划分,加机器扩容就能满足需求,但实际上并非如此,一方面分布式会增加系统复杂性,另一方面集群规模上去之后,也会引入一堆AIOps、服务发现、服务治理的新问题。
因为垂直向的限制,所以,我们通常更关注水平扩展,高并发系统的实施也主要围绕水平方向展开。
3.实现高并发的关键技术
1.集群化:负载均衡
负载均衡就是把负载(request)均衡分配到不同的服务实例,利用集群的能力去对抗高并发,负载均衡是服务集群化的实施要素
2.数据库层面:分库分表+读写分离
就是把一个库分成多个库,部署在多个数据库服务上,主库承载写请求,从库承载读请求。从库可以挂载多个,因为很多场景写的请求远少于读的请求,这样就把对单个库的压力降下来了。
如果写的请求上升就继续分库分表,如果读的请求上升就挂更多的从库,但数据库天生不是很适合高并发,而且数据库对机器配置的要求一般很高,导致单位服务成本高,所以,这样加机器抗压力成本太高,还得另外想招。
3.读多写少:缓存
缓存的理论依据是局部性原理。
一般系统的写入请求远少于读请求,针对写少读多的场景,很适合引入缓存集群。
在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求,因为缓存集群很容易做到高性能,所以,这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。
缓存的命中率一般能做到很高,而且速度很快,处理能力也强(单机很容易做到几万并发),是理想的解决方案。
CDN本质上就是缓存,被用户大量访问的静态资源缓存在CDN中是目前的通用做法。
4.高写入:消息中间件
相同的资源下,数据库系统太重太复杂,所以并发承载能力就在几千/s的量级,所以此时你需要引入别的一些技术。
比如说消息中间件技术,也就是MQ集群,它是非常好的做写请求异步化处理,实现削峰填谷的效果。
消息队列能做解耦,在只需要最终一致性的场景下,很适合用来配合做流控。
消息队列本身也跟缓存系统一样,可以用很少的资源支撑很高的并发请求,用它来支撑部分允许异步化的高并发写入是很合适的,比使用数据库直接支撑那部分高并发请求要减少很多的机器使用量。
5.避免挤兑:流控
再强大的系统,也怕流量短事件内集中爆发,就像银行怕挤兑一样,所以,高并发另一个必不可少的模块就是流控。流控的关键是流控算法
- 1.计数器算法(固定窗口)
- 2.滑动窗口算法
- 3.漏桶算法
- 4.令牌桶算法
总结
高并发和高性能是紧密相关的,提高应用的性能,可以提高系统的并发能力。所以上面主要介绍了解决高并发所带来的问题的有效方案。
详情请查询:https://www.jb51.net/article/212772.htm
注意:此文章为学习记录文章,参考多篇文章,如有不正之处请指教