亿级用户的请求分层过滤模型
请求处理模型
直筒型
直筒型请求处理模型,指的是用户请求 1:1 的洞穿到db层,如下图所示。在比较简单的业务中,才会采用这个模型。
传统的低并发、低性能、低可用项目。
直筒型请求处理模型的适用场景:
企业级应用。
特点:
1. 用户规模较小
2. 请求峰值和平均值相差不大
3. 请求峰值不会超过数据层的处理能力
漏斗型
漏斗型业务,指的是,用户的请求,从客户端到 db层,层层递减,递减的程度视业务而定。例如当 10w 人去抢100个物品时,db层的请求在个位数量级 1000以内,这就是比较理想的模型。
漏斗型请求处理模型的适用场景:
互联网应用(如秒杀)
特点:
1. 用户规模大
2. 请求峰值和平均值相差巨大
3. 请求峰值远远超出最后一层(数据层)的处理能力
漏斗模型中的请求分层过滤
漏斗型请求处理模型的核心策略,对请求进行分层过滤。
而针对漏斗型请求处理模型(如秒杀场景)一 种核心策略,就是对请求进行分层过滤,从而过滤掉一些无效的请求。
案例:秒杀系统的分层过滤
比如,在秒杀系统中,请求分别经过 CDN、Nginx(商品详情)、微服务(如seckill)和数据库这几层,那么:
1 大部分数据和流量在用户浏览器或者 CDN上获取,这一层可以拦截大部分静态资源的读取;
2、经过第二层 Nginx(商品详情)时,尽量得走 Nginx Cache,过滤一些可以直接访问Nginx缓存的 请求;经过第二层 Nginx(商品详情)时,也可以进行流控,还可以进行黑名单过滤,拦截掉一些无效的流量;
3、再到服务层,进入微服务网关时,可以做用户的授权检验,对系统做好保护和限流,这样数据量和请求就进一步减少;
4、业务层,还可以进行数据的有效性、一致性过滤,这里又减少了一些流量。这样就像漏斗一样,尽量把数据量和请求量一层一层地过滤和减少了。
分层过滤的核心思想是:在不同的层次尽可能地过滤掉无效请求,让“漏斗”最末端的才是有效 请求。而要达到这种效果,我们就必须对数据做分层的校验。
写入操作的流量削峰方案(降级方案)
削峰从本质上来说,就是更多地延缓用户请求,以及层层过滤用户的访问需求,遵从【最后落地到数据 库的请求数要尽量少】的原则。
同步的直接调用转换成异步的间接推送
要对流量进行削峰,最容易想到的解决方案就是用消息队列来缓冲瞬时流量,把同步的直接调用转换成 异步的间接推送,中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
消息队列中间件主要解决应用耦合、异步消息、流量削峰等问题。常用的消息队列系统有ActiveMQ、 RabbitMQ、ZeroMQ、Kafka、Me'taMQ和RocketMQ等。
在这里,消息队列就像是水库一样,拦截上游的洪水,削减进下游河道的洪峰流量,从而达到减免洪水灾害的目的。
分层限流:防止系统雪崩的无奈策略
分层限流:接入层、服务层 限流,根据各层的能力,对系统进行保护