RateLimiter限流

1、处理高并发

  1.1高并发处理方案: 

  • 缓存 缓存的目的是提升系统访问速度和增大系统处理容量
  • 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开
  • 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理

  1、2限流方式: mq、ratelimiter

  

2、ratelimiter是基于令牌桶算法来做的 

  guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌,只有取到令牌的请求才会被成功响应,获取的方式有两种:阻塞等待令牌或者取不到立即返回失败

另外简单介绍漏铜算法:

  请求以一定速度进入漏桶中,如果请求速度>处理请求速度则溢出,漏桶算法能强行处理请求速率。但如果在处理高并发时,突然来大量请求这种方案不合适  

令牌桶代码:create():每秒创建多少令牌

      tryacquire():尝试获取令牌,tryacquire():尝试获取一个令牌,如果获取不到立即返回;tryacquire(int permits, long timeout, TimeUnit unit):尝试获取permits个令牌,如果获取不到等待timeout时间

·核心算法:

package com.leolztang.sb.aop.ratelimiter;

import org.springframework.stereotype.Service;

import com.google.common.util.concurrent.RateLimiter;

@Service
public class AccessLimitService {
    RateLimiter rateLimiter=RateLimiter.create(100.0);
    //尝试获取令牌
    public boolean tryAcquire() {
        return rateLimiter.tryAcquire();
    }
}

测试类: 

package com.leolztang.sb.aop.ratelimiter;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/limit")
public class AccessLimiterController {
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(120);
    @Autowired
    private AccessLimitService accessLimitService;

    @RequestMapping(value="/ratelimit",method = RequestMethod.GET)
    @ResponseBody
    public void tryForVisit() {
        for(int i=0;i<200;i++) {
            fixedThreadPool.execute(new Runnable() {

                @Override
                public void run() {
                    String str=visitAccess();
                    System.out.println("output:"+str);
                }
            });
        }
    }

    public String visitAccess() {
        if(accessLimitService.tryAcquire()) {
            try {
                Thread.sleep(2000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            return "aceess success [" + sdf.format(new Date()) + "]";
        }else {
            return "aceess limit [" + sdf.format(new Date()) + "]";
        }
    }
}

pom文件引入guava依赖:

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>

3、

原文地址:https://www.cnblogs.com/enhance/p/11201190.html

时间: 2024-10-08 11:28:31

RateLimiter限流的相关文章

Guava RateLimiter限流问题

问题背景 有一个需求,需要进行限流,选择使用的Guava RateLimiter,但是发现在限流方面,还是存在一些问题(单机),特别是当瞬时访问量特别大的时候, 请看下面一个代码,应该输出什么结果? package cn.ganlixin.guava; import com.google.common.util.concurrent.RateLimiter; import org.junit.Test; import java.time.LocalTime; public class UserR

Guava的RateLimiter实现接口限流

最近开发需求中有需要对后台接口进行限流处理,整理了一下基本使用方法. 首先添加guava依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency> 然后封装RateLimiter适用对多接口的限制: import com.goog

最近学习了限流与RateLimiter

前言 分布式环境下应对高并发保证服务稳定几招,按照个人理解,优先级从高到低分别为缓存.限流.降级.熔断,每招都有它的作用,本文重点就讲讲限流这部分. 坦白讲,其实上面的说法也不准确,因为服务降级.熔断本身也是限流的一种,因为它们本质上也是阻断了流量进来,但是本文希望大家可以把限流当做一个单纯的名词来理解,看一下对请求做流控的几种算法及具体实现方式. 为什么要限流 其实很好理解的一个问题,为什么要限流,自然就流量过大了呗,一个对外服务有很多场景都会流量增大: 业务用户量不断攀升 各种促销 网络爬虫

使用RateLimiter完成简单的大流量限流,抢购秒杀限流

RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时间内的访问量,譬如一些第三方服务会对用户访问量进行限制:限制网速,单位时间内只允许上传下载多少字节等. 下面来看一些简单的实践,需要先引入guava的maven依赖. 一 有很多任务,但希望每秒不超过N个 import com.google.common.util.concurrent.RateLi

coding++:高并发解决方案限流技术-使用RateLimiter实现令牌桶限流-Demo

RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时间内的访问量,譬如一些第三方服务会对用户访问量进行限制:限制网速,单位时间内只允许上传下载多少字节等. guava的maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guav

高并发学习之使用RateLimiter实现令牌桶限流

RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率.通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时间内的访问量,譬如一些第三方服务会对用户访问量进行限制:限制网速,单位时间内只允许上传下载多少字节等. guava的maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava

网站限流处理

1.常见两种方式 漏桶算法和令牌桶算法 漏桶算法:1.有一个固定容量的漏桶,已固定的速率流出水滴. 2.可以任意速率流入水滴到漏桶 3.当漏桶满了,水溢出(相当于丢弃) 令牌桶算法: 1.以固定的速率向桶里放令牌 2.当桶内的令牌数量达到最大值后,后续放入的令牌被丢弃 3.当需要发送N个单位大小的数据时,就从桶内去N个令牌 4.当桶内的令牌数量小于设定的大小时,不能删除令牌,也就是不能发送数据,这是数据可能被丢弃,也可能被缓冲区缓存下来. 2.其它方式 统计计数,主要思想是记录指定时间内的访问量

接口限流

一.什么是限流 使资源以限定的速率被使用.比如:地铁限流,高峰时段限制单位时间内的客流量:电路中的限流器,可以保证电路不超过额定的电流:网站限流,抢购,瞬间的高峰对于后台来说肯定是需要一个限流处理为可接受的速率进行处理. 二.为什么要限流 比如:地铁不限流量,挤爆了:电路不限流,灯爆了:网站不限流,撑爆了. 三.限流的几种方式 常用的限流算法有两种:漏桶算法和令牌桶算法. 漏桶算法:桶中水以限定的速度流出来.缺点:水满溢出.突发请求不能尽快处理,被调整为固定速率. 令牌桶算法:系统会以一个限定的

服务接口API限流 Rate Limit

一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统,便在对服务接口做了许多策略:服务接口降级.限流.引流等.本文讨论下限流策略,虽然降低了服务接口的访问频率和并发量,却换取服务接口和业务应用系统的可用性. 二.常用的限流算法 常用的限流算法由:楼桶算法和令牌桶算法.本文不具体的详细说明两种算法的原理,原理会在接下来的文章中做说明. 1.漏桶算法 漏桶(Leaky Bucket)算法思路很简单,水(请求)先