前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Google平滑限流方案——Guava

Google平滑限流方案——Guava

作者头像
黑洞代码
发布2021-01-14 16:31:14
2.1K0
发布2021-01-14 16:31:14
举报

限流的场景——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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档