信号量与令牌桶_限流的4种方式&令牌桶实战

本文介绍了限流的四种方式,并重点探讨了令牌桶算法,包括其原理和Google Guava库中的RateLimiter实现。通过示例展示了如何在Spring Boot中使用RateLimiter进行限流,讨论了RateLimiter的公平性以及与信号量的区别,并对比了令牌桶和漏桶算法。最后,应用排队理论分析了系统响应时间和客户数量的关系。
摘要由CSDN通过智能技术生成

限流的4种方式

正文

限流

限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。常用的限流算法有令牌桶和和漏桶,而Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流缓存:缓存的目的是提升系统访问速度和增大系统处理容量

降级:降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行

限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理

我们经常在调别人的接口的时候会发现有限制,比如微信公众平台接口、百度API Store、聚合API等等这样的,对方会限制每天最多调多少次或者每分钟最多调多少次

我们自己在开发系统的时候也需要考虑到这些,比如我们公司在上传商品的时候就做了限流,因为用户每一次上传商品,我们需要将商品数据同到到美团、饿了么、京东、百度、自营等第三方平台,这个工作量是巨大,频繁操作会拖慢系统,故做限流。

以上都是题外话,接下来我们重点看一下令牌桶算法

令牌桶算法

下面是从网上找的两张图来描述令牌桶算法:

RateLimiter

RateLimiter的代码不长,注释加代码432行,看一下RateLimiter怎么用

1 package com.cjs.example;

2

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

4 import org.springframework.web.bind.annotation.RequestMapping;

5 import org.springframework.web.bind.annotation.RestController;

6

7 import java.text.SimpleDateFormat;

8 import java.util.Date;

9

10 @RestController

11 public class HelloController {

12

13 private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

14

15 private static final RateLimiter rateLimiter = RateLimiter.create(2);

16

17 /**

18 * tryAcquire尝试获取permit,默认超时时间是0,意思是拿不到就立即返回false

19 */

20 @RequestMapping("/sayHello")

21 public String sayHello() {

22 if (rateLimiter.tryAcquire()) { // 一次拿1个

23 System.out.println(sdf.format(new Date()));

24 try {

25 Thread.sleep(500);

26 } catch (InterruptedException e) {

27 e.printStackTrace();

28 }

29 }else {

30 System.out.println("limit");

31 }

32 return "hello";

33 }

34

35 /**

36 * acquire拿不到就等待,拿到为止

37 */

38 @RequestMapping("/sayHi")

39 public String sayHi() {

40 rateLimiter.acquire(5); // 一次拿5个

41 System.out.println(sdf.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值