go笔记-限速器(limiter)

摘要:
First create a rate Limited有两个参数。第一个参数是每秒的事件数,第二个参数是可以存储在其缓存中的最大事件数。AllowfuncAllow()bool//Allow是AllowN的一个简化函数。如果需要在事件超过频率时丢弃或跳过该事件,请使用AllowN。否则,请使用“保留”或“等待”。ReservefuncReserve()*保留//保留是ReserveN的简化形式。FuncReserveN*Reservation//ReserveN返回对象Reservation,该对象标识调用方需要等待n个事件发生的时间。如果要使用上下文的截止日期或取消方法,请使用WaitN。FuncWaitfuncWaitN//WaitN阻塞,直到lim允许n个事件发生//-如果lim的等待时间超过Context的超时,则报告错误。
参考:
https://blog.csdn.net/wdy_yx/article/details/73849713
https://www.jianshu.com/p/1ecb513f7632
https://studygolang.com/articles/13254
"golang.org/x/time/rate"

golang 提供上述包 用来对速度进行限制

Limter限制时间的发生频率,采用令牌池的算法实现。这个池子一开始容量为b,装满b个令牌,然后每秒往里面填充r个令牌。
由于令牌池中最多有b个令牌,所以一次最多只能允许b个事件发生

Limter提供三中主要的函数 Allow, Reserve, and Wait. 大部分时候使用Wait。

首先创建一个rate.Limiter,其有两个参数,第一个参数为每秒发生多少次事件,第二个参数是其缓存最大可存多少个事件。

//例如: 每秒产生200*cpu个数个令牌,最多存储200*cpu个数个令牌。
limiter = rate.NewLimiter(rate.Limit(200.NumCPU()), 200*runtime.NumCPU())

rate.Limiter提供了三类方法用来限速

  • Wait/WaitN 当没有可用或足够的事件时,将阻塞等待 推荐实际程序中使用这个方法
  • Allow/AllowN 当没有可用或足够的事件时,返回false
  • Reserve/ReserveN 当没有可用或足够的事件时,返回 Reservation,和要等待多久才能获得足够的事件。

Allow
func (lim *Limiter) Allow() bool
//Allow 是函数 AllowN(time.Now(), 1)的简化函数。

func (lim *Limiter) AllowN(now time.Time, n int) bool
//AllowN标识在时间now的时候,n个事件是否可以同时发生(也意思就是now的时候是否可以从令牌池中取n个令牌)。如果你需要在事件超出频率的时候丢弃或跳过事件,就使用AllowN,否则使用Reserve或Wait.

Reserve

func (lim *Limiter) Reserve() *Reservation
//Reserve是ReserveN(time.Now(), 1).的简化形式。

func (lim *Limiter) ReserveN(now time.Time, n int) *Reservation
//ReserveN 返回对象Reservation ,标识调用者需要等多久才能等到n个事件发生(意思就是等多久令牌池中至少含有n个令牌)。
//如果ReserveN 传入的n大于令牌池的容量b,那么返回false. 

使用样例如下:

r := lim.ReserveN(time.Now(), 1)
if !r.OK() {
    //Not allowed to act! Did you remember to set lim.burst to be > 0 ?我只要1个事件发生仍然返回false,是不是b设置为了0?
return
}
time.Sleep(r.Delay())
Act()

如果希望根据频率限制等待和降低事件发生的速度而不丢掉事件,就使用这个方法。
我认为这里要表达的意思就是如果事件发生的频率是可以由调用者控制的话,可以用ReserveN 来控制事件发生的速度而不丢掉事件。如果要使用context的截止日期或cancel方法的话,使用WaitN。

Wait

//Wait是WaitN(ctx, 1)的简化形式。
func (lim *Limiter) Wait(ctx context.Context) (err error)
func (lim *Limiter) WaitN(ctx context.Context, n int) (err error)
//WaitN 阻塞当前直到lim允许n个事件的发生。 
//- 如果n超过了令牌池的容量大小则报错。 
//- 如果Context被取消了则报错。 
//- 如果lim的等待时间超过了Context的超时时间则报错。

免责声明:文章转载自《go笔记-限速器(limiter)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇线上redis bgsave导致服务响应延迟tk.mybatis 报错:tk.mybatis.mapper.MapperException: tk.mybatis.mapper.MapperException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FLINK基础(107): DS算子与窗口(18)窗口 (3) window functions(二)ProcessWindowFunction

ProcessWindowFunction   一些业务场景,我们需要收集窗口内所有的数据进行计算,例如计算窗口数据的中位数,或者计算窗口数据中出现频率最高的值。这样的需求,使用ReduceFunction和AggregateFunction就无法实现了。这个时候就需要ProcessWindowFunction了。 先来看接口定义 public abstr...

给HttpClient添加Socks代理

本文描述http client使用socks代理过程中需要注意的几个方面:1,socks5支持用户密码授权;2,支持https;3,支持让代理服务器解析DNS; 使用代理创建Socket 从原理上来看,不管用什么http客户端(httpclient,okhttp),最终都要转换到java.net.Socket的创建上去,看到代码: package java...

HttpClient4.3教程 第四章 HTTP认证

HttpClient4.3教程 第四章 HTTP认证 Posted on2013 年 10 月 17 日 HttpClient既支持HTTP标准规范定义的认证模式,又支持一些广泛使用的非标准认证模式,比如NTLM和SPNEGO。 4.1.用户凭证 任何用户认证的过程,都需要一系列的凭证来确定用户的身份。最简单的用户凭证可以是用户名和密码这种形式。Use...

转:android中APK开机自动运行

背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_COMPLETED。只要在程序中“捕捉”到这个消息,再启动之即可。记住,Android框架说:Don't call me, I'll call you back。我们要做的是做好接...

【aspnetcore】在过滤器(Filter)中使用注入服务(ServiceFilter|TypeFilter)

在MVC中,AOP是很常用的功能,我们经常会使用如 ActionFilter,IAuthorizeFilter 等描述对Controller和Action进行约束和扩展,一般做法如下: public class TestActionFilterAttribute : Attribute, IActionFilter { public voi...

Android 换肤

导读:皮肤程序的AndroidManifest.xml中配置 皮肤一般含有多个文件,例如图片、配置等文件,分散的文件不利于传输和使用,最好打包。打包的格式一般选择zip格式。这里分两种情况,一种是apk,例如AdwLauncher,它的桌面皮肤格式是一个apk;另一种是自定义扩展名,例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga,它们的文...