限流的场景——12306图形验证码
土是土了点,但是多少也能起到限流
限流的场景——双十一
11.11零点,由于各种商家的促销活动(前XX名免单),支付宝进入排队支付状态
限流的场景——外卖业务
情人节鲜花爆仓
·商家电话打爆
·平台电话打爆
·骑手电话打爆
常见的限流方案——手动实现负载均衡
常见的限流方案——验证码
12306故意把验证码弄的模糊不堪,影响消费者下单,从而限流
常见的限流方案——容器限流
常见的web容器其实也具备限流的功能
·以Tomcat容器为例,其Connector其中一种配置有如下几个参数
·acceptCount:如果Tomcat的线程都忙于响应,新来的连接会进入队列排队,如果超出排队大小,则拒绝连接
·maxConnections: 瞬时最大连接数,超出的会排队等待
·maxThreads:Tomcat能用来处理请求的最大线程数,如果请求处理量一直远远大于最大线程数则可能会僵死
常见的限流方案——限流总资源数
如果有的资源是稀缺资源(如数据库连接、线程),而且可能有多个系统都会去使用它,那么需要限制应用;
可以使用池化技术来限制总资源数:连接池、线程池。
比如分配给每个应用的数据库连接是100
那么本应用最多可以使用100个资源,超出了可以等待或者抛异常。
常见的限流方案——限流某个接口的总并发/请求数
如果接口可能会有突发访问情况,但又担心访问量太大造成崩溃,如抢购业务;
这个时候就需要限制这个接口的总并发请求数了;
因为粒度比较细,可以为每个接口都设置相应的阀值。可以使用Java中的AtomicLong进行限流:
try{
if(atomic.incrementAndGet() > 限流数) { //拒绝请求 } //处理请求 }finally { atomic.decrementAndGet(); }
常见的限流方案——Nginx限流
Nginx负载均衡
Nginx提供了一个叫ngx_http_limit_req_module的模块进行流量控制
常见的限流方案——消息队列
通过RabbitMQ,RocketMQ,ActiveMQ,ZeroMQ,Kafka把流量做均匀,限制高流量涌入
常见的限流方案——利用Netflix的Hystrix限流
以上就是全部的限流方案了???
咱们说了这么多,能达到满分了吗?
腾讯阅读面试——你知道的还不够多
Guava简介
Guava是一个 Google开发的 基于java的类库集合的扩展项目,包括 collections, caching, primitives support,concurrency libraries, common annotations, string processing, I/O, 等等.这些高质量的 API可以使你的JAVA代码更加优雅,更加简洁,让你工作更加轻松愉悦
限流的概念
限流:限制流量
限流可以认为服务降级的一种
限流就是限制系统的输入和输出流量已达到保护系统的目的。
一般来说系统的吞吐量是可以被测算的
为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的
比如:延迟处理,拒绝处理,或者部分拒绝处理等等。
腾讯阅读的限流方案
Guava并发包提供的降级方案
啥?没听过?
给大家面试的一点小意见:
(1)面试要不卑不亢,不要怂
(2)遇到不会的问题,可以请教一下面试官
Guava限流核心算法
限流算法——漏桶算法(Leaky Bucket)
漏桶算法(Leaky Bucket):
水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),
当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,
可以看出漏桶算法能强行限制数据的传输速率
限流算法——令牌桶算法(Token Bucket)
令牌桶算法(Token Bucket):
随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token
(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了.
新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务
漏桶算法VS令牌桶算法
·令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求;
·漏桶则是按照常量固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝;
·令牌桶限制的是平均流入速率(允许突发请求,只要有令牌就可以处理,支持一次拿3个令牌,4个令牌),并允许一定程度突发流量;
·漏桶限制的是常量流出速率(即流出速率是一个固定常量值,比如都是1的速率流出,而不能一次是1,下次又是2),从而平滑突发流入速率;
·令牌桶允许一定程度的突发,而漏桶主要目的是平滑流入速率;
两个算法实现可以一样,但是方向是相反的,对于相同的参数得到的限流效果是一样的。
Guava限流实战
GuavaRateLimiter实现平滑限流
Guava的RateLimiter提供了令牌桶算法实现以下两种限流:
(1)平滑突发限流(SmoothBursty)
(2)平滑预热限流(SmoothWarmingUp)实现。
平滑突发限流(SmoothBursty)
平滑预热限流(SmoothWarmingUp)
Guava用于秒杀场景
Guava对比其他限流方案的特点
·流量可控:控制令牌产生的速率
·限流平滑:线程池/Hystrix等限流方案,一旦造成资源耗尽(线程池打满,信号量用完),很可能造成一段时间内都拒绝请求,依赖于对资源的释放后,才能处理新的请求。这样在我们的秒杀场景里,很可能会造成,请求开始后,请求结束前,被秒的商品居多,中间的时间段几乎秒不到商品。用Guava令牌桶限流,至少可以保证令牌产生的速率恒定,也就可以保证被秒杀的商品速率恒定。
guava源码地址:https://github.com/google/guava
demo源码地址:https://github.com/online-demo/yunxi-guava.git