限流策略总结

这段时间开启过年的热身运动,抢票大战。现在是各种加速包满天飞,感觉买到就是赚到,和12306斗智斗勇。今天我就以我的经验来分析加速包在哪种方式有效。
要做加速包功能,必须要考虑的是系统的限流,因为系统给你限流了,不处理的请求,你弄再多的加速包也白搭。
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。
缓存:它的存在就是加速请求访问,保护后台服务。使用缓存不单单能够提升系统访问速度、提高并发访问量,也是保护数据库、保护系统的有效方式。
降级:就是把不是核心链路的服务采用不同的服务方式处理掉,保证核心链路的服务正常访问,服务方式大致可分为拒接服务,延迟服务以及随机服务。
限流:就是控制系统处理请求的吞吐量,达到保护系统正常访问的目的。
我们回到限流策略上,限流可分为单机限流,公共资源限流,分布式限流,接入层限流。其中单机限流的常用处理手段有:计数器、漏桶、令牌桶等等。下面我们先聊聊单机版的:
1计数器
计数器限流算法主要用来限制总并发数,比如数据库连接池大小、线程池大小、程序访问并发数等都是使用计数器算法。其中计数器可以分为两种策略,一种请求服务超过请求阈值就拒绝请求,另一种是请求服务超过阈值是就把请求加入队列。拒绝请求方式可通过AomicInteger等原子计数器来实现,把请求加入队列可使用Semaphore来实现。
代码实现:
总结:
优点:该策略可以承受恶意用户的大量请求,甚至超出系统预期的承受。
缺点:该限流策略存在一个时间临界点的问题。举个例子,在双十一秒杀中,11.10号的23.59.59秒基本没人下单,但是到0点以后,请求瞬间超过请求阈值,大量请求根据服务方式来处理请求。
2漏桶
漏桶可以用于流量整形(Traffic Shaping)和流量控制(Traffic Policing),漏桶算法的描述如下:
我们把存放流量的缓存区比作一个桶,不过这个桶底部有一个小孔,所以叫做漏桶,这个漏桶大小是固定的,现在任意并发数的请求进入漏桶中,当漏桶还没满时,请求(水滴)就从底部小孔出来交给业务系统去处理,当漏桶满时,则流入的水滴(请求)就溢出了(被丢弃),这样达到了流量整形,流量控制的目的。该策略是控制请求流出漏桶的速率。
代码实现:
3令牌桶
请求角度:
我们把存放流量的缓存区比作一个桶,但是这个桶底部没有小孔哦,你可以把它看做为一个队列,但是流量要进入这个队列就必须有一个令牌(该令牌是以固定速率添加到队列中),否则是不能进入队列的,然后队列中流量开始进入业务系统去处理,当请求处理完以后,就把该请求的令牌丢弃。
令牌角度:
因为恒定速率生成的令牌不断的放入到令牌桶中,当令牌桶满了以后,就会把令牌丢弃掉,当带有令牌的流量处理完成以后就会把该令牌丢弃掉。另一方面请求去拿令牌是没有速度限制的,这意味面对瞬时大流量。顺便说一下限流神器:Guava RateLimiter,该神器就是通过令牌桶算法来实现限流的,同时实现限流可分为平滑突发限流和平滑预热限流。

公共资源限流
从使用的软件入手:比如tomcat,mysql,redis,这些软件就会有配置进行限流。下面列举一下各个软件的限流参数:
tomcat:
acceptCount:如果Tomcat的线程都忙于响应,新来的连接请求会进入队列排队,如果超出排队大小,则拒绝连接;
maxConnections: 瞬时最大连接数,超出的会排队等待;
maxThreads:Tomcat能启动用来处理请求的最大线程数,如果请求处理量一直远远大于最大线程数则可能会僵死。
mysql:
max_connections。
redis:
tcp-backlog
分布式限流/接入层限流:(这两类限流我没弄过,直接上链接,以后有机会遇到在写总结,我写这篇博客的目的就是为了总结前人的智慧和我们工作中如果遇到了限流问题,根据具体问题,给出最合理的方案):
https://www.cnblogs.com/winner-0715/p/9611149.html
补充一下,现在阿里开源了限流框架:Sentinel,最近也是在慢慢的写demo尝试使用,以后用熟了再在此博客上补充。
回到我们说买火车票这件事上,因为票都是从12306出来的,人家票都没有,携程等是第三方公司,肯定没有了。如果12306限流策略变了,那些加速包肯定也就失效了。

查看过的博客链接:

https://www.jianshu.com/p/d11baa736d22
https://www.jianshu.com/p/d9504fc0af4d
https://blog.csdn.net/Gupaoxueyuan/article/details/78843386?utm_source=blogkpcl9
https://www.cnblogs.com/winner-0715/p/9611149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值