Golang标准库限流器rate使用

Go 语言限流 阅读详情

       限流就是限制系统的输入和输出流量来达到保护系统的目的,限流在实际场景中应用十分广泛,尤其在高并发场景下,为了保证系统的可以用性,我们需要采取一些限流措施降级,一旦达到限制的阈值,就需要限制流量并采取一些措施来完成限制流量的目的(比如:延迟处理、拒绝处理等),以防止过多的请求而导致系统崩溃。

在golang的标准库golang.org/x/time/rate有一个限流器的实现,这个限流器的实现方案是令牌桶。

 

1、令牌桶

令牌桶是比较常见的限流算法之一,如下图所示:

        令牌桶可以用来限制突发的流量,在下面图中,有一个桶,桶的大小是固定的,系统以一定的速率往桶中添加令牌,当桶满时,就会溢出,新添加的令牌会被丢弃。当请求需要被处理时,需要先从桶中获取令牌,当没有令牌可取时,则可以选择排队等待或者拒绝服务。

在这里插入图片描述

从上面的图看来,令牌桶的实现需要一个定时器和等待队列,定时器以一定的频率往桶中放入令牌,而等待队列用于存放等待的请求。但是这样的实现效率太低,在golang的标准库中的实现是通过计算时间的差值来算出令牌的。

 

2、标准库限流器的使用

标准库中的限流器相关定义如下:

Limit:速率,定义了某些事件的最大速率,为每秒事件数,也就是每秒往令牌桶中放入多少个令牌。Inf是无限速率。

type Limit float64

const Inf = Limit(math.MaxFloat64)

Every:这个函数可以将产生一个令牌的时间转化为每秒产生多少个令牌,比如100ms产生一个令牌,那么1s将产生10个令牌。

func Every(interval time.Duration) Limit {
	if interval <= 0 {
		return Inf
	}
	return 1 / Limit(interval.Seconds())
}

NewLimiter:创建一个限流器

func NewLimiter(r Limit, b int) *Limiter {
	return &Limiter{
		limit: r,
		burst: b,
	}
}

参数如下:

  • 第一个参数r Limit:产生令牌的速率,也就是每秒往桶中放入多少个令牌。
  • 第二个参数b int:令牌桶的大小。

对于下面这个例子,就是构造一个每秒产生10个令牌,令牌桶大小为20的限流器:

limiter := NewLimiter(10, 20)

 

2.1 消费令牌

Limiter提供了三种消费令牌的方法,可以用来消费一个或多个令牌,每种方法代表了当令牌不足时,各种的对应手段:

  • Wait / WaitN
  • Allow / AllowN
  • Reserve / ReserveN

 

Wait / WaitN
func (lim *Limiter) Wait(ctx context.Context) (err error)
func (lim *Limiter) WaitN(ctx context.Context, n int) (err error)

Wait相当于WaitN(ctx, 1)

WaitN消费n个令牌,如果令牌的数量不够,将会阻塞等待。它的第一个参数为Context,也就是我们可以控制等待的最大时长。如果n超过了突发大小也就是桶的大小、Context被取消或者预期的等待时间超过了Context的Deadline,将会返回一个错误。

 

Allow / AllowN
func (lim *Limiter) Allow() bool
func (lim *Limiter) AllowN(now time.Time, n int) bool

Allow相当于AllowN(time.Now(), 1)

AllowN可以用来获取截至到某一时间,是否有n个令牌可用。如果满足则返回true,同时消费n个令牌,反之则不消费,返回false。

通常用于不满足条件则直接丢弃请求。

 

Reserve / ReserveN
func (lim *Limiter) Reserve() *Reservation
func (lim *Limiter) ReserveN(now time.Time, n int) *Reservation

Reserve相当于ReserveN(time.Now(), 1)

ReserveN返回一个Reservation,Reservation可用用来指示在有n个令牌可用之前必须等待多长时间。

可用调用Reservation的Delay方法来获取需要等待的时间:

func (r *Reservation) Delay() time.Duration

或者调用Cancel来取消,该方法会将token归还:

func (r *Reservation) Cancel()

ReserveN的使用示例如下:

r := lim.ReserveN(time.Now(), 1)
if !r.OK() {
    // Not allowed to act! Did you remember to set lim.burst to be > 0 ?
    return
}
time.Sleep(r.Delay())
Act()

Limiter支持动态设置速率以及桶的大小:

func (lim *Limiter) SetLimit(newLimit Limit)
func (lim *Limiter) SetLimitAt(now time.Time, newLimit Limit)

func (lim *Limiter) SetBurst(newBurst int)
func (lim *Limiter) SetBurstAt(now time.Time, newBurst int)

 

3、源码探究

3.1 Limit

Limit是令牌产生的速率

type Limit float64

它有两个方法,分别是一段时间内产生的令牌数量和产生一定的令牌数量所需的时间:

// 计算时间间隔d内产生的令牌数量
func (limit Limit) tokensFromDuration(d time.Duration) float64 {
	if limit <= 0 {
		return 0
	}
    // 时间间隔d内产生的令牌数量,产生的令牌数量 = 时间间隔 * 产生的速率  n = d * limit
	return d.Seconds() * float64(limit)
}

// 计算产生tokens个令牌所需的时间间隔
func (limit Limit) durationFromTokens(tokens float64) time.Duration {
	if limit <= 0 {
		return InfDuration
	}
    
    // 所需的时间 = 令牌数量 / 令牌产生速率
	seconds := tokens / float64(limit)
	return time.Duration(float64(time.Second) * seconds)
}

 

3.2 Limiter

Limiter的定义如下:

type Limiter struct {
	mu     sync.Mutex       // 锁,保证并发安全
	limit  Limit            // 令牌产生的速率,每秒产生多少个令牌
	burst  int              // 桶的大小,突发速率大小 
	tokens float64
	
	last time.Time         // tokens字段的最后一次更新时间
	
	lastEvent time.Time    // 速率限制事件的最新时间 
}

可以看到在Limiter的定义中并没有定时器,token数量的计算可以使用当前时间与最后一次的更新时间以及产生令牌的速率进行计算。

Reservation的定义如下:

Reservation用来保存限流器运行在一定时间延迟后发生的事件的信息:

type Reservation struct {
	ok        bool            // 事件是否可以发生
	lim       *Limiter        // 指向Limiter
	tokens    int             // 需要的token数量
	timeToAct time.Time       // 事件可以发生的时间点
	// This is the Limit at reservation time, it can change later.
	limit Limit              // 预定时的速率,后续可能会改变
}

首先来看Reserve和ReserveN的代码:

func (lim *Limiter) Reserve() *Reservation {
	return lim.ReserveN(time.Now(), 1)
}

func (lim *Limiter) ReserveN(now time.Time, n int) *Reservation {
	r := lim.reserveN(now, n, InfDuration)
	return &r
}

最终都调用到了reserveN方法,lim.reserveN(now, n, InfDuration)返回截至到现在消费n个令牌的相关信息,最大等待时间为无限。

func (lim *Limiter) reserveN(now time.Time, n int, maxFutureReserve time.Duration) Reservation {
	lim.mu.Lock()
	defer lim.mu.Unlock()
	
    // 如果令牌产生速率是无限的,那么事件是可以直接发生的
	if lim.limit == Inf {
		return Reservation{
			ok:        true,
			lim:       lim,
			tokens:    n,
			timeToAct: now,
		}
    // 如果令牌产生的速率为0,则要看桶中是否有足够的令牌,如果没有,事件则不可能发生    
	} else if lim.limit == 0 {
		var ok bool
		if lim.burst >= n {
			ok = true
			lim.burst -= n
		}
		return Reservation{
			ok:        ok,
			lim:       lim,
			tokens:    lim.burst,
			timeToAct: now,
		}
	}
	
    // 计算最新状态,tokens为截至现在令牌桶中令牌的数量
	now, last, tokens := lim.advance(now)

	// 计算请求产生后的剩余数量
	tokens -= float64(n)

	// 计算等待间隔
	var waitDuration time.Duration
    // 如果tokens < 0,说明令牌不够了,计算产生-tokens个令牌需要等待的时间
	if tokens < 0 {
		waitDuration = lim.limit.durationFromTokens(-tokens)
	}

	// 只有需要的令牌数量小于桶的大小 而且 等待时间小于最大的等待时间,该事件才可以发生
	ok := n <= lim.burst && waitDuration <= maxFutureReserve

	// Prepare reservation
	r := Reservation{
		ok:    ok,
		lim:   lim,
		limit: lim.limit,
	}
	if ok {
		r.tokens = n
		r.timeToAct = now.Add(waitDuration)   // 事件发生的事件,为现在时刻 + 需要等待的事件,如果令牌足够,就不需要等待
	}

	// 更新状态
	if ok {
		lim.last = now
		lim.tokens = tokens
		lim.lastEvent = r.timeToAct     // lastEvent为最后一次事件发生的时间
	} else {
		lim.last = last
	}

	return r
}

// Advance计算并返回由于时间推移而产生的lim的更新状态
func (lim *Limiter) advance(now time.Time) (newNow time.Time, newLast time.Time, newTokens float64) {
    // last为最后一个更新token的时间
	last := lim.last
	if now.Before(last) {
		last = now
	}

	// elapsed为最后一次更新token的时间到现在的时间间隔
	elapsed := now.Sub(last)
    // 计算这个时间间隔内产生的令牌数量
	delta := lim.limit.tokensFromDuration(elapsed)
    // 计算当前时间令牌桶中令牌数量
	tokens := lim.tokens + delta
    // 令牌桶中令牌的最大数量为burst
	if burst := float64(lim.burst); tokens > burst {
		tokens = burst
	}
	return now, last, tokens
}

Reserve和ReserveN最终都会返回一个Reservation,使用它可以获取事件发生需要等待的时间,如果等待的时间太长,也可以取消,取消则需要将令牌归还。

// OK返回限流器是否能够在最大等待时间内提供所请求的令牌数量。
func (r *Reservation) OK() bool {
	return r.ok
}

// 返回需要等待的时间
func (r *Reservation) Delay() time.Duration {
	return r.DelayFrom(time.Now())
}

// 取消
func (r *Reservation) Cancel() {
	r.CancelAt(time.Now())
}

func (r *Reservation) CancelAt(now time.Time) {
	if !r.ok {
		return
	}

	r.lim.mu.Lock()
	defer r.lim.mu.Unlock()
	
    // 如果r.timeToAct.Before(now) 也就是事件发生于现在之前,那么就没必要归还了,相当于事件已经发生了,直接返回
	if r.lim.limit == Inf || r.tokens == 0 || r.timeToAct.Before(now) {
		return
	}

	// 计算需要归还的令牌数量
	restoreTokens := float64(r.tokens) - r.limit.tokensFromDuration(r.lim.lastEvent.Sub(r.timeToAct))
	if restoreTokens <= 0 {
		return
	}
	// 计算到现在的相关信息 
	now, _, tokens := r.lim.advance(now)
	// 计算新的桶中的token数量 
	tokens += restoreTokens
	if burst := float64(r.lim.burst); tokens > burst {
		tokens = burst
	}
	// 更新状态 
	r.lim.last = now
	r.lim.tokens = tokens
	if r.timeToAct == r.lim.lastEvent {
		prevEvent := r.timeToAct.Add(r.limit.durationFromTokens(float64(-r.tokens)))
		if !prevEvent.Before(now) {
			r.lim.lastEvent = prevEvent
		}
	}
}

 

接下来看WaitN的实现,WaitN的实现也使用到了reserveN,我们可以猜到,其实就是调用reserveN,然后判断是否需要等待,需要则等待Reservation.Delay()的时间即可:

func (lim *Limiter) WaitN(ctx context.Context, n int) (err error) {
	lim.mu.Lock()
	burst := lim.burst
	limit := lim.limit
	lim.mu.Unlock()
	
    // 如果需要的令牌数大于桶的大小而且速率不是无限的,那么就返回err
	if n > burst && limit != Inf {
		return fmt.Errorf("rate: Wait(n=%d) exceeds limiter's burst %d", n, burst)
	}
    
	// 检查ctx是否已经取消了
	select {
	case <-ctx.Done():
		return ctx.Err()
	default:
	}
    
	// 计算最大的等待时间间隔
	now := time.Now()
	waitLimit := InfDuration
	if deadline, ok := ctx.Deadline(); ok {
		waitLimit = deadline.Sub(now)
	}
    
	// Reserve
	r := lim.reserveN(now, n, waitLimit)
	if !r.ok {
		return fmt.Errorf("rate: Wait(n=%d) would exceed context deadline", n)
	}
    
	// 获取需要等待的时间
	delay := r.DelayFrom(now)
    // 无需等待
	if delay == 0 {
		return nil
	}
    // 创建定时器,等待delay的时间
	t := time.NewTimer(delay)
	defer t.Stop()
	select {
	case <-t.C:
		// We can proceed.
		return nil
	case <-ctx.Done():
		// Context was canceled before we could proceed.  Cancel the
		// reservation, which may permit other events to proceed sooner.
		r.Cancel()
		return ctx.Err()
	}
}

 

AllowN的实现同样用到了reserveN方法,这个方法只是简单的返回在一个时间点,需要n个令牌是否可以满足,最大的等待时间设置为了0:

func (lim *Limiter) AllowN(now time.Time, n int) bool {
	return lim.reserveN(now, n, 0).ok
}
服务治理:几种开源限流算法库/应用软件介绍和使用 🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 一、Go time/rate 限流器 1.1 简介 Go 在 x 标准库,即 golang.org/x/time/rate 里自带了一个限流器,这个限流器是基于令牌桶算 阅读详情

相关推荐

Go 限流器 limter

Go 实现熔断器 https://blog.youkuaiyun.com/weixin_46825193/article/details/107032136 -https://mp.weixin.qq.com/s?__biz=MzA3MjgwNTQ3OA%3D%3D&chksm=9f19ff27a86e76319e144c77418bdc64bf36abe9aa59edc0bf7c058a6c0003efbf096c4cc049&idx=1&mid=2247483950&scene=2

王小明的专栏 1158

go官方自带限流神器time/rate详细教程

Go 语言官方提供的一个限流库,用于在程序中限制特定操作的速率。该库使用了令牌桶算法,可以通过设置一个速率限制r(即每秒可以执行的操作数)和一个容量b(即令牌桶的大小)来控制操作的速率

多年后端开发经验,专注于Golang和PHP语言的开发 4418

govatar:GO语言的头像生成库

古凡达 GOvatar是用GO编写的头像生成库 笔记 从v0.4.0版本开始,最低支持的golang版本为1.16。 安装 酿造 $ brew tap o1egl/tap $ brew install govatar 码头工人 $ docker pull o1egl/govatar 从来源 $ go get -u github.com/o1egl/govatar/... 预构建的可用于Mac,Linux和Windows。 用法 $ govatar generate male -o avatar.png # Generates random avatar.png for male $ govatar generate female -o avatar.png # Generates random ava

golang rate令牌桶源码分析实现

golang令牌桶实现

qq_18447271的博客 648

头歌工程实训答案-机器学习篇之手写体识别篇

第2关:激活函数'''x:负无穷到正无穷的实数'''if x<=0:return 0else:return x#***第3关:反向传播算法import os。

m0_71537260的博客 2518

Clarity 3D Layout

Clarity 3D Layout Clarity 3D layout是3D 全波电磁场模型提取工具,它可以导入已经设计好的PCB文件也可以直接在Clarity 3D layout创建版图进行3D 全波电磁场模型提取。

m0_53280471的博客 5475

Golang 标准库限流器 time/rate 使用

Golang 标准库中就自带了限流算法的实现,即 golang.org/x/time/rate。该限流器是基于 Token Bucket(令牌桶) 实现的。 简单来说,令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放 Token,桶满则暂时不放。 而用户则从桶中取 Token,如果有剩余 Token 就可以一直取。如果没有剩余 Token,则需要等到系统中被放置了 Token 才行。 本文则主要集中介绍下该组件的具体使用方法: 构造一个限流器 limiter := NewLimiter(10, 1

a...Z 2369

金融科技创新中人工智能的应用:8篇优质论文精选(含2023)

随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。

2401_82426425的博客 3210

golang http 最大请求数_Golang 标准库 限流器 time/rate 设计与实现

友情提示:此篇文章大约需要阅读 12分钟7秒,不足之处请多指教,感谢你的阅读。 订阅本站限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务、网关、和一些后台服务中会经常遇到。限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现。限流器的实现方法有很多种,例如 Token Bucket、滑动窗口法、Leaky Bucket等。在 Gola...

weixin_39581845的博客 528

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

Vue - 在纯 HTML 普通项目中实现组件化,让原生 html 项目支持引入 *.vue 组件 / 组件与组件间的互相引用等,完美解决了引入组件出现的跨域问题(保姆级详细教程,完整示例源码及插件)

html中使用vue组件,在HTML页面中引入vue组件,HTML界面利用http-vue-loader.js以组件方式引入vue文件,使用http-vue-loader引入组件出现报错,在html页面使用http-vue-loader插件引入组件报跨域错误,如何解决http-vue-loader引用组件时出现跨域问题,纯html原生web项目引入vue后如何实现组件引入,使用http-vue-loader插件控制台报错跨域,http-vue-loader跨域怎么办官方文档,html页面如何引入.vu

🏆 前端领域优质创作者 3904

golang获取wav音频文件时长_Golang 标准库 限流器 time/rate 设计与实现

友情提示:此篇文章大约需要阅读 12分钟7秒,不足之处请多指教,感谢你的阅读。 订阅本站限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务、网关、和一些后台服务中会经常遇到。限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现。限流器的实现方法有很多种,例如 Token Bucket、滑动窗口法、Leaky Bucket等。在 Gola...

weixin_39608559的博客 863

【Camera2教程一】Camera2的框架Pipeline和framework中核心类和接口的详细介绍

Camera2 的 API 模型被设计成一个 Pipeline(管道),它按顺序处理每一帧的请求并返回请求结果给客户端。

jiangchaobing_2017的博客 790

Golang 标准库限流器 time/rate 实现剖析(下)

限流器是微服务中必不缺少的一环,可以起到保护下游服务,防止服务过载等作用。上一篇文章 《Golang 限流器 time/rate 使用介绍》 简单介绍了 time/rate 的使用方法,本文则着重分析下其实现原理。建议在正式阅读本文之前,先阅读下上一篇文章。上一篇文章讲到,time/rate 是基于 Token Bucket(令牌桶) 算法实现的限流。本文将会基于源码,深入剖析下 Golang 是如何实现 Token Bucket 的。其代码也非常简洁,去除注释后,也就 200 行左右的代码量。同时,我也提

qq_48826531的博客 487

最优控制 (Optimal Control) 算法详解及案例分析

最优控制是一种通过优化控制输入,使系统在满足约束条件的情况下达到最优性能的控制方法。其目标是最小化或最大化一个性能指标。

闲人编程的博客 2090

YOLO 线性小目标涨点|3890 张输电导线散股 VOC+YOLO 单类别数据集实战,无人机电力缺陷巡检全流程落地

架空输电导线是电网能量传输核心载体,长期受风力摆动、雷击、腐蚀、外力撞击作用,外层铝股极易出现断裂散股故障。导线散股初期仅少量铝丝开裂,肉眼与无人机远距离航拍下属于细长微弱线性小目标;若未及时发现,散股会持续扩张,引发导线过热、断线、大面积停电重大电力安全事故。传统人工巡检存在多重行业痛点:山区、跨江河线路人员无法攀爬登杆,高空作业人身坠落风险极高;无人机单次航拍产出数千张高清图片,人工逐帧筛查微小散股耗时 3-5 天,阴天、逆光、植被遮挡场景漏检率超 45;

lin_xiu的博客 51

golang中文文档_Golang 标准库 限流器 time/rate 设计与实现

限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务、网关、和一些后台服务中会经常遇到。限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现。限流器的实现方法有很多种,例如 Token Bucket、滑动窗口法、Leaky Bucket等。在 Golang 库中官方给我们提供了限流器的实现golang.org/x/time/rate,它是...

weixin_39571179的博客 161

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Golang 标准库限流器 time/rate 使用介绍(上)

限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。 限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket 等。其实 Golang 标准库中就自带了限流算法的实现,即 。该限流器是基于 Token Bucket(令牌桶) 实现的。简单来说,令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放 Token,桶满则暂时不放。 而用户则从桶中取 Token,如果有剩余 Token 就可以一直取。如果没有剩余 Token,则需要等到系统中被

qq_48826531的博客 681

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【go类库分享】go rate 原生标准限速库

【go类库分享】go rate 原生标准限速库

weixin_45565886的博客 1056

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【golang】根据key做处理速度rate限制+key过期功能

golang限速rate包使用示例。带缓存的map+限速

神隐寻觅的博客 1101

golang 判断时间是否是 rfc3339_Golang 标准库 限流器 time/rate 设计与实现

限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务、网关、和一些后台服务中会经常遇到。限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现。限流器的实现方法有很多种,例如 Token Bucket、滑动窗口法、Leaky Bucket等。在 Golang 库中官方给我们提供了限流器的实现golang.org/x/time/rate,它是...

weixin_39534978的博客 181

Golang 限流器 time/rate 使用介绍

  本主题为系列文章,分上下两篇。本文主要介绍 time/rate 的具体使用方法,另外一篇文章 《Golang 限流器 time/rate 实现剖析》 则着重介绍其内部实现原理。   限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。 限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket 等。   其实 golang 标准库...

void 1625

【GoCN酷Go推荐】单机限流器time/rate库

1、限流是什么顾名思义,限流就是只在一段时间内对流通量的管控限制。限流器是后台服务中的非常要的组件,用于限制请求速率,保护服务,避免服务过载。golang标准库中自带了令牌桶限流算法的实现...

Go中国 606

golang time 获取昨天时间_Go官方的限流器 time/rate 如何使用

本主题为系列文章,分上下两篇。本文主要介绍time/rate的具体使用方法,下一篇文章将会着重介绍其内部实现原理。限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket等。其实golang标准库中就自带了限流算法的实现,即golang.org/x/time/rate。该限流器是基...

weixin_39849888的博客 277

go中如何使用easyjson_Go官方的限流器 time/rate 如何使用

本主题为系列文章,分上下两篇。本文主要介绍time/rate的具体使用方法,下一篇文章将会着重介绍其内部实现原理。限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket等。其实golang标准库中就自带了限流算法的实现,即golang.org/x/time/rate。该...

weixin_34732699的博客 135

golang float64 转int_Golang限流器time/rate使用介绍

本主题为系列文章,分上下两篇。本文主要介绍time/rate的具体使用方法,另外一篇文章《Golang限流器time/rate实现剖析》则着重介绍其内部实现原理。限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。 限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket等。其实golang标准库中就自带了限流算法的实现,即gola...

weixin_39814093的博客 179
上一篇: k8s权限控制RBAC
下一篇: k8s编程operator——(2) client-go中的informer
CoreDump丶
博客等级 码龄8年 451粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值