如果平时系统的访问量只有一万,而最大承受限制为五万,在秒杀时刻的瞬间,访问量突然增加到100W,此事系统一定会因访问量过大而宕机,此时就应该设计一个限流策略,使服务器能接收和处理的请求减少。
秒杀限流策略的目的:在系统流量突增的情况下保证系统的稳定性
限流总策略——多层限流
第一层:合法性限流
所谓合法性限流就是判断请求是否合法,例如:同一用户的频繁多次刷单请求和机器人刷单就是非法请求
限流策略就是验证码和统计IP黑名单
第二层:网络负载限流
网络负载限流,就是利用服务器集群和网络OSI七层协议进行动态限流,将用户请求进行负载分担。
常见的网络负载限流主要在第四层和第七层,第七层应用层一般采用Nginx服务器,而第四层传输层则通常采用LVS。
LVS简介
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
Nginx服务器:动静分离、负载均衡
级联负载:就是综合网络七层所有能用到的负载条件和策略。
第三层:服务限流
服务限流可以说是最后一层限流,但是也是做常用和最重要的限流
主要限流策略为:
- Tomact搭建集群并设置最大连接数
- 使用特定算法
- 设置mq消息队列
- Nginx做负载均衡、动静分离
- 缓存
(1)Tomcat设置最大连接数
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" acceptCount="300" maxThreads="200" />
(2)令牌桶算法
·
@Component
public class RateLimitInterceptor extends AbstractInterceptor {
public static final int REQUEST_COUNT = 1;
private static final RateLimiter rateLimiter = RateLimiter.create(REQUEST_COUNT);
@Override
protected boolean preHandle(HttpServletRequest request) {
if (!rateLimiter.tryAcquire()) {
return false;
}
return true;
}
}
(3)消息队列
常见的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等
目前行业中流行的消息队列主要是RabbitMQ、Kafka
1、 RabbitMq比kafka成熟,在可用性上,稳定性上,可靠性上,RabbitMq超过kafka
2、 Kafka设计的初衷就是处理日志的,可以看做是一个日志系统,针对性很强,所以它并没有具备一个成熟MQ应该具备的特性
3、 Kafka的性能比RabbitMq要强,这篇文章的作者认为,两者在这方面没有可比性。
(4)Nginx负载
(5)缓存
- 提升性能
绝大多数情况下,select 是出现性能问题最大的地方。一方面,select 会有很多像 join、group、order、like 等这样丰富的语义,而这些语义是非常耗性能的;另一方面,大多 数应用都是读多写少,所以加剧了慢查询的问题。
分布式系统中远程调用也会耗很多性能,因为有网络开销,会导致整体的响应时间下降。为了挽救这样的性能开销,在业务允许的情况(不需要太实时的数据)下,使用缓存是非常必要的事情。
- 缓解数据库压力
当用户请求增多时,数据库的压力将大大增加,通过缓存能够大大降低数据库的压力。
总结
秒杀服务器限流策略主要的三个限流方式,其中前两个是请求到达服务器之前所做的物理限流,而第三层是请求到达服务器之后,主要是使用软件和代码进行限流。
图片来自网络,如有侵权请联系删除