如何更好的限流解决突发问题
发布日期:2021-08-22 02:44:38 浏览次数:2 分类:技术文章

本文共 2545 字,大约阅读时间需要 8 分钟。

  1. Guava RateLimit SmoothBurst 支持特定时间内限流,但是问题是突发时还是容易造成服务端压力
  2. Guava RateLimit SmoothWarmingUp 通过设置一个预热的过程,达到速度后会趋向于平均速度限流。
import com.google.common.util.concurrent.RateLimiter;public class RateLimitToolTest {	public static void main(String[] args) throws InterruptedException {		test3();	}	// SmoothyBurst	private static void test() {		RateLimiter limiter = RateLimiter.create(5);		// limiter.acquire() 返回获取操作的耗时,以秒为单位		System.out.println(limiter.acquire());		System.out.println(limiter.acquire());		System.out.println(limiter.acquire());		System.out.println(limiter.acquire());		System.out.println(limiter.acquire());		System.out.println(limiter.acquire());	}	public static void test1() {		// 每秒允许5个请求,表示桶容量为5且每秒新增5个令牌,即每隔0.2毫秒新增一个令牌		RateLimiter limiter = RateLimiter.create(5);		// 一次性消费5个令牌		System.out.println(limiter.acquire(5));		// limiter.acquire(1)将等待差不多1秒桶中才能有令牌		System.out.println(limiter.acquire(1));		// 固定速率		System.out.println(limiter.acquire(1));		// 固定速率		System.out.println(limiter.acquire(1));		// 固定速率		System.out.println(limiter.acquire(1));	}	public static void test2() throws InterruptedException {		// 每秒允许5个请求,表示桶容量为5且每秒新增5个令牌,即每隔0.2毫秒新增一个令牌		RateLimiter limiter = RateLimiter.create(200);		long start = System.currentTimeMillis();		TimeUnit.SECONDS.sleep(2);		for (int i = 1; i <= 1000; i++) {			// 第一秒突发了10个请求			limiter.acquire(1);			if (i % 100 == 0) {				System.out.println("Spend " + (System.currentTimeMillis() - start) + " ms");			}		}	}	public static void test3() throws InterruptedException {		RateLimiter limiter = RateLimiter.create(200);		TimeUnit.SECONDS.sleep(1);		long start = System.currentTimeMillis();		for(int i =1; i < 500;i++) {			System.out.println(limiter.acquire());		}		long point = System.currentTimeMillis();		System.out.println("Spend " + (point - start));		Thread.sleep(1000L);		for(int i =1; i < 500;i++) {			System.out.println(limiter.acquire());		}		System.out.println("Spend " + (point - start));	}	// SmoothWarmingUp	public static void test4() throws InterruptedException {		RateLimiter limiter = RateLimiter.create(200,1000, TimeUnit.MILLISECONDS);		TimeUnit.SECONDS.sleep(1);		long start = System.currentTimeMillis();		for(int i =1; i < 500;i++) {			System.out.println(limiter.acquire());		}		long point = System.currentTimeMillis();		System.out.println("Spend " + (point - start));		Thread.sleep(1000L);		for(int i =1; i < 500;i++) {			System.out.println(limiter.acquire());		}		System.out.println("Spend " + (point - start));	}}复制代码

转载于:https://juejin.im/post/5c88a2dde51d455e4d7193b1

转载地址:https://blog.csdn.net/weixin_33734785/article/details/91427588 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:基于朴素贝叶斯的垃圾邮件分类
下一篇:set,map,array,object(一)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月29日 12时57分59秒