一、什么是高并发
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。
响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
吞吐量:单位时间内处理的请求数量。
QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
二、并发场景分析
1.秒杀
秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。
此种场景就是非常有特点的高并发场景,如果不对流量进行合理管控,肆意放任大流量冲击系统,那么将导致一系列的问题出现,比如一些可用的连接资源被耗尽、分布式缓存的容量被撑爆、数据库吞吐量降低,最终必然会导致系统产生雪崩效应。
一般来说,大型互联网站通常采用的做法是通过扩容、动静分离、缓存、服务降级、限流六种常规手段来保护系统的稳定运行。
1.扩容
为了满足业务需求,需要通过增加服务器的数量,或存储数量,或带宽数量,或计算能力等,都叫服务器扩容。在服务器架构允许的情况下,一般通过增加服务器的数量来解决。优点是简单,缺点是成本高
2.限流
在电商系统的秒杀中,也会有大批量的用户同时涌入,鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。常用的限流框架有sentinel,springcloud gateway,Nginx限流。常用的限流算法有固定窗口算法,滑动窗口算法,漏桶算法,令牌桶算法。
sentinel采用的是滑动窗口算法。gateway和Nginx都采用的令牌桶算法。
3.服务降级
在秒杀页面将其他不重要的后台服务进行降级,减少后台服务器压力
4.动静分离
动静分离主要是把前端页面静态化,减少对后台服务器的请求。
5.缓存
限流和静态化和服务降级都是为了减轻服务器后端的压力。但是最终用户的请求还是会落到服务器中,为了增加用户的体验度,我们也应加快相应速度。后端代码和数据库之间的交互会降低相应速度,所以我们可以采用Redis来进行数据的高速读取。针对电商或者购票网站来说,特别是库存量的超卖现象,我们可以在开始秒杀的时候,把总的库存量存入Redis中,每当用户来抢购时,利用String类型的decr方法去减一,如果减一成功就视认为抢够成功,并把用户和商品信息存入Redis的订单条目中,当最终抢购结束时,我们再一并把Redis的订单信息存入到数据库中。
2.采集或者回调
对于接收回调消息的接口或者采集埋点的接口,在业务处理的时候并发特别高,可以采用消息队列和缓存的方式来保证系统的稳定性。
1.消息队列
消息队列最重要的特性就是异步和削峰,但是消息队列也有缺点,在消费能力不足时会有消息积压问题,导致业务处理延迟。比如比邻接收开平回调就非常适合使用消息队列。
2.缓存
对于这种使用消息队列的业务,需要保证不产生重复消费,而且保证业务的消费速度,可以使用redis对于消费消息主键进行幂等去重。对于热点接口可以采用缓存 本地缓存保证接口响应速度。比如查询商家状态这种 可以将商家状态缓存起来 避免频繁数据库查询操作。