一句话:分层过滤,分而治之。
即,在不同的层次尽可能地过滤掉无效请求,让“漏斗”最末端的才是有效请求。
具体实现方法可参考阿里巴巴技术面试官欧阳修老师的《高并发系统的难点&常见解决方法》系列讲座,现在可以免费试听
扫码报名,免费试听
第一个方法,页面静态化
静态化就是指把原本动态生成的html页面变为静态内容保存,用户客户端请求的时候,直接返回静态页面,不用再经过服务渲染,不用访问数据库,可以大大的减小数据库的压力,显著的提高性能。
12306这类抢票系统可以实现前后端分离,页面资源不会经过后端服务器,将前端资源,放入CDN服务器中。
CDN 的全称是 Content Delivery Network,即内容分发网络。CDN 是依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
简单来说,就是把前端资源放在服务器中,减少数据库的压力
第二个方法:缓存预热
将部分业务逻辑写到缓存里,不需要直接读数据库,来减少数据库服务器的压力,这样访问速度会更快。
例如:在抢票时间开始前,提前将设置好车次、限购数量,库存数量等写入Redis中。
这同样是一个减少数据库压力的方式。
第三个方法:异步化
异步化的意思是接取一个任务直接给后台,再接下一个任务,一直一直这样,谁的先读取完先执行谁的, 可以使用消息队列实现。
消息队列特点
1.基于生产者/消费者模型的组件。
2.用于实现两个不同的系统之间的解耦和异步 (Asynchronous) 操作。
3.生产者可以高速地向消息队列中投递(生产)消息。
4.消费者可以按照自己的节奏去消费生产者投递的消息。
5.消息队列一般带有重试的能力。可以持续投递,直到消费者消费成功。
异步化就是通过消息中间件来削峰填谷,将请求先发往消息队列中,订单服务端根据自己能力再去消费并创建订单。
此外,我们也要采取一些措施来保证系统的稳定和高可用,参考欧阳修老师在《秒杀系统项目课》提供的思路,分别是——
01
限流,流量控制
对于抢票系统来说,抢票时请求瞬间的流量是不可控的,没办法准确预估多少,但是系统的处理能力是有限的,当流量过大时服务器会被打挂。
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,保护系统不会被压垮,从而保障应用的高可用性。
02
服务熔断
熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。
这种牺牲局部,保全整体的措施就叫做熔断。
要理解熔断的原理,我们先来讲一下血崩。
当前系统中有A,B,C三个服务,服务A是上游,服务B是中游,服务C是下游。
一旦下游服务C因某些原因变得不可用,积压了大量请求,服务B的请求线程也随之阻塞。线程资源逐渐耗尽,使得服务B也变得不可用。紧接着,服务A也变为不可用,整个调用链路被拖垮。
像这种调用链路的连锁故障,这种不可用像滚雪球一样逐渐放大的时候,叫做雪崩效应。
熔断器,如同电力过载保护器,在一段时间内侦测到许多类似的错误,就会强迫其以后的调用该服务的快速失败,不再访问该服务,从而防止应用程序不断地尝试执行可能会失败的操作。当检测到该节点微服务响应正常后恢复调用链路。
这也是一个扛住高并发的思路。
扫码报名,免费试听
戳下方
阅读原文”免费试听课程
继续阅读
阅读原文