• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

Spring Boot的应用限流

技术杂谈 勤劳的小蚂蚁 2个月前 (02-10) 73次浏览 已收录 0个评论 扫描二维码

前言
在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。
比如最近就有个这样的需求,我作为客户端要向 kafka生产数据,而 kafka的消费者则再源源不断的消费数据,并将消费的数据全部请求到 web服务器,虽说做了负载(有4台 web服务器)但业务数据的量也是巨大的,每秒钟可能有上万条数据产生。如果生产者直接生产数据的话极有可能把 web服务器拖垮。
对此就必须要做限流处理,每秒钟生产一定限额的数据到 kafka,这样就能极大程度的保证 web的正常运转。
其实不管处理何种场景,本质都是降低流量保证应用的高可用。

常见算法

对于限流常见有两种算法:
  • 漏桶算法
  • 令牌桶算法
漏桶算法比较简单,就是将流量放入桶中,漏桶同时也按照一定的速率流出,如果流量过快的话就会溢出( 漏桶并不会提高流出速率)。溢出的流量则直接丢弃。
如下图所示:
这种做法简单粗暴。
漏桶算法虽说简单,但却不能应对实际场景,比如突然暴增的流量。
这时就需要用到 令牌桶算法:
令牌桶会以一个恒定的速率向固定容量大小桶中放入令牌,当有流量来时则取走一个或多个令牌。当桶中没有令牌则将当前请求丢弃或阻塞。
相比之下令牌桶可以应对一定的突发流量.

RateLimiter实现

对于令牌桶的代码实现,可以直接使用 Guava包中的 RateLimiter
  1. @Override
  2. publicBaseResponse<UserResVO> getUserByFeignBatch(@RequestBodyUserReqVO userReqVO){
  3.    //调用远程服务
  4.    OrderNoReqVO vo =newOrderNoReqVO();
  5.    vo.setReqNo(userReqVO.getReqNo());
  6.    RateLimiter limiter =RateLimiter.create(2.0);
  7.    //批量调用
  8.    for(int i =0;i<10; i++){
  9.        double acquire = limiter.acquire();
  10.        logger.debug("获取令牌成功!,消耗="+ acquire);
  11.        BaseResponse<OrderNoResVO> orderNo = orderServiceClient.getOrderNo(vo);
  12.        logger.debug("远程返回:"+JSON.toJSONString(orderNo));
  13.    }
  14.    UserRes userRes =newUserRes();
  15.    userRes.setUserId(123);
  16.    userRes.setUserName("张三");
  17.    userRes.setReqNo(userReqVO.getReqNo());
  18.    userRes.setCode(StatusEnum.SUCCESS.getCode());
  19.    userRes.setMessage("成功");
  20.    return userRes ;
  21. }
详见此。
调用结果如下:
代码可以看出以每秒向桶中放入两个令牌,请求一次消耗一个令牌。所以每秒钟只能发送两个请求。按照图中的时间来看也确实如此(返回值是获取此令牌所消耗的时间,差不多也是每500ms一个)。
使用 RateLimiter有几个值得注意的地方:
允许 先消费,后付款,意思就是它可以来一个请求的时候一次性取走几个或者是剩下所有的令牌甚至多取,但是后面的请求就得为上一次请求买单,它需要等待桶中的令牌补齐之后才能继续获取令牌。

总结

针对于单个应用的限流 RateLimiter够用了,如果是分布式环境可以借助 redis来完成。具体实现在接下来讨论。


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring Boot的应用限流
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00