当前位置:首页 > 数码 > Go中的流量限度-有效控制流量 (go流量控制)

Go中的流量限度-有效控制流量 (go流量控制)

admin4个月前 (05-14)数码16

引见

速率限度是构建可裁减和弹性系统的关键技术。它经过对指定期间范围内准许的恳求数量施加限度来协助控制流量。在Go中成功速率限度可以确保最佳的资源应用,并包全您的运行程序免受适度流量或滥用行为的影响。在这篇博文中,咱们将探求Go中的速率限度技术,并提供适用的代码示例来协助您有效地成功它们。

了解速率限度

速率限度包含定义一组规定,这些规定选择客户端在给定的期间窗口内可以收回多少恳求。确保系统能够处置负载,防止滥用或拒绝服务攻打。限度速率的两种经常出现方法是:

在GO中成功速率限度

Go提供了一个名为 golang.org/x/time/rate 的内置包,提供速率限度性能。让咱们讨论一下如何同时经常使用固定窗口和令牌桶方法来成功速率限度。

固定窗口

go流量控制
funcfixedWindowRateLimiting(){limiter:=rate.NewLimiter(rate.Limit(100),1)//准许每秒100次fori:=0;i<200;i++{if!limiter.Allow(){fmt.Println("Ratelimitexceeded.Requestrejected.")continue}goprocess()}}//处置恳求funcprocess(){fmt.Println("Requestprocessedsuccessfully.")time.Sleep(time.Millisecond)//模拟恳求处置期间}

在下面的代码片段中,咱们创立了一个限度经常使用率。速率限度为每秒100个恳求的 NewLimiter 。对每个恳求调用 limiter.Allow() 方法,假设准许恳求,则前往;假设超越速率限度,则前往。假设超越速率限度,恳求将被拒绝。

对应的输入为,清楚的看到局部恳求曾经被拒绝了:

Requestprocessedsuccessfully.Ratelimitexceeded.Requestrejected.Ratelimitexceeded.Requestrejected.Ratelimitexceeded.Requestrejected.Ratelimitexceeded.Requestrejected.Ratelimitexceeded.Requestrejected.Ratelimitexceeded.Requestrejected.Ratelimitexceeded.Requestrejected....

令牌桶

functokenBucketRateLimiting(){limiter:=rate.NewLimiter(rate.Limit(10),5)ctx,_:=context.WithTimeout(context.TODO(),time.Millisecond)fori:=0;i<200;i++{iferr:=limiter.Wt(ctx);err!=nil{fmt.Println("Ratelimitexceeded.Requestrejected.")continue}goprocess()}}//处置恳求funcprocess(){fmt.Println("Requestprocessedsuccessfully.")time.Sleep(time.Millisecond)//模拟恳求处置期间}

在上述代码中,咱们经常使用 rate.NewLimiter 创立了一个限度器,其速率限度为每秒10个恳求,突发5个恳求。每个恳求都会调用 limiter.Wait() 方法,该方法会阻塞直到有令牌可用。假设水桶是空的,没有可用的令牌,恳求就会被拒绝。

对应的输入为,清楚的看到局部恳求曾经被拒绝了:

Requestprocessedsuccessfully.Ratelimitexceeded.Requestrejected.Ratelimitexceeded.Requestrejected.Requestprocessedsuccessfully.Ratelimitexceeded.Requestrejected.

灵活速率限度

灵活速率限度是指依据客户端行为、系统负载或业务规定等灵活要素调整速率限度。这种技术准许您实时调整速率限度,以优化资源应用率并提供更好的用户体验。让咱们看看Go中灵活速率限度的示例:

funcdynamicRateLimiting(){limiter:=rate.NewLimiter(rate.Limit(10),1)//准许每秒100次//Dynamicrateadjustmentgofunc(){time.Sleep(time.Second*10)//每10秒调整limiterfmt.Println("---adjustlimiter---")limiter.SetLimit(rate.Limit(200))//将limiter优化到每秒200}()fori:=0;i<3000;i++{if!limiter.Allow(){fmt.Println("Ratelimitexceeded.Requestrejected.")time.Sleep(time.Millisecond*100)continue}process()}}//处置恳求funcprocess(){fmt.Println("Requestprocessedsuccessfully.")time.Sleep(time.Millisecond*10)//模拟恳求处置期间}

在下面的代码片段中,咱们创立了一个限度器,初始速率限度为每秒10个恳求。而后,咱们启动一个,在10秒钟后将速率限度调整为每秒200个恳求。这样,咱们就能依据始终变动的状况灵活调整速率限度。

对应的输入为,这里咱们可以看到中途的时刻,某些恳求曾经被拒绝掉了,起初咱们经过灵活调整,后续的恳求都可以反常经过了:

...Requestprocessedsuccessfully.Ratelimitexceeded.Requestrejected.Requestprocessedsuccessfully.---adjustlimiter---Ratelimitexceeded.Requestrejected.Requestprocessedsuccessfully.Requestprocessedsuccessfully.Requestprocessedsuccessfully.Requestprocessedsuccessfully.Requestprocessedsuccessfully....

自顺应速率限度

自顺应速率限度可依据之前恳求的照应期间或失误率灵活调整速率限度。它准许系统智能顺应不同的流量条件,确保最佳性能和资源应用率。让咱们看看Go中自顺应速率限度的示例:

funcadaptiveRateLimiting(){limiter:=rate.NewLimiter(rate.Limit(10),1)//准许每秒10次//自顺应调整gofunc(){for{time.Sleep(time.Second*10)responseTime:=measureResponseTime()//测量之前恳求的照应期间ifresponseTime>500*time.Millisecond{fmt.Println("---adjustlimiter50---")limiter.SetLimit(rate.Limit(50))}else{fmt.Println("---adjustlimiter100---")limiter.SetLimit(rate.Limit(100))}}}()fori:=0;i<3000;i++{if!limiter.Allow(){fmt.Println("Ratelimitexceeded.Requestrejected.")time.Sleep(time.Millisecond*100)continue}process()}}//测量以前恳求的照应期间//口头自己的逻辑来测量照应期间funcmeasureResponseTime()time.Duration{returntime.Millisecond*100}//处置恳求funcprocess(){fmt.Println("Requestprocessedsuccessfully.")time.Sleep(time.Millisecond*10)//模拟恳求处置期间}

在上述代码片段中,咱们经常使用 measureResponseTime 函数模拟测量之前恳求的照应期间。依据测量到的照应期间,咱们经过经常使用 limiter.SetLimit 设置不同的值来灵活调整速率限度。这样,系统就能依据观察到的照应期间调整其速率限度战略。

对应的输入为:

Requestprocessedsuccessfully.Ratelimitexceeded.Requestrejected.Requestprocessedsuccessfully.Ratelimitexceeded.Requestrejected.---adjustlimiter100---Requestprocessedsuccessfully.Requestprocessedsuccessfully.Requestprocessedsuccessfully.Requestprocessedsuccessfully.Requestprocessedsuccessfully.

总结

速率限度是保养Go运行程序稳固性和安保性的基本技术。经过有效控制传入恳求的流量,您可以防止资源耗尽并确保资源的偏心调配。在这篇博文中,咱们讨论了固定窗口和令牌桶速率限度的概念,并提供了代码片段,展示如何经常使用golang.org/x/time/rate包在Go中成功它们。将速率限度归入您的运行程序,以构建能够高效处置不同流量水平的弹性系统。

当然可以经常使用第三方库来成功,比如说: go.uber.org/ratelimit


goagent有流量限制吗

每日每个应用1G流量!如果超过则需要等待下一日才可以使用!

电信欢go定向流量是什么意思

您好,首先感谢您对中国电信的关注和支持。 根据您的描述,内定向流量为哪种业务的定向流量了,不同的定向流量,使用范围不同,定向流量是指你在国内通过中国电信手机上网使用特定业务时产生的数据流量。 回复仅供参考,具体请咨询或登录安徽电信网上营业厅为准,安徽电信竭诚为您服务,希望我的回答能得到您的采纳。 安徽电信“存款到银行 0元拿手机”活动上线!凭身份证及银行卡至银行活动网点,办理存款免费拿手机业务。 只要您在银行存款,同时承诺手机套餐保底消费和在网时长,安徽电信即免费赠送您手机一部,同时存款还能获得利息。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Go

“Go中的流量限度-有效控制流量 (go流量控制)” 的相关文章

中-Goroutines-成功轻量级并发的高效并发原语-Go

中-Goroutines-成功轻量级并发的高效并发原语-Go

并发是现代软件开发的一个基本概念,使程序能够同时口头多个义务。在Go编程畛域,了解Goroutines是至关关键的。本文将片面概述Goroutines,它们的轻量级特性,如何经常使用go关键字创立...

Go-言语中并发的弱小效劳 (go语言语法很奇怪啊)

Go-言语中并发的弱小效劳 (go语言语法很奇怪啊)

施展效率和照应才干 并发是现代软件开发中的一个基本概念,它使程序能够同时口头多个义务,提高效率和照应才干。在本文中,咱们将讨论并发在现代软件开发中的关键性,并深化了解Go处置并发义务的共同...

在-使用-应用-中构建高性能-Echo-Web-Go (在使用应急法压缩时间时,不一定)

在-使用-应用-中构建高性能-Echo-Web-Go (在使用应急法压缩时间时,不一定)

Echo是一个高性能且易用的框架,用于构建Go语言编写的Web应用。它具备灵活的路由功能、方便的请求处理、强大的中间件支持和简单的JSON操作,非常适合快速开发API服务和Web应用。 快速...

etcd-的依赖问题最终得到解决-Go (etcd的英文全称)

etcd-的依赖问题最终得到解决-Go (etcd的英文全称)

几年前,我经常接触到一组微服务相关组件:gRPC、gRPC 网关、etcd、Protobuf 和 protoc-gen-go。一开始,它们都能很好地协同工作,并且随着新版本的发布而持续更新。...

Go-内存调配优化-在结构体中充沛应用内存 (go 内存)

Go-内存调配优化-在结构体中充沛应用内存 (go 内存)

在经常使用Golang启动内存调配时,咱们须要遵照一系列规定。在深化了解这些规定之前,咱们须要先了解变量的对齐形式。 Golang的unsafe包中有一个函数Alignof,签名如下: f...

内存优化与渣滓搜集-深化探求优化程序性能的最佳通常-Go (内存优化与渣子有关吗)

内存优化与渣滓搜集-深化探求优化程序性能的最佳通常-Go (内存优化与渣子有关吗)

Go提供了智能化的内存治理机制,但在某些状况下须要更精细的微调从而防止出现OOM失误。本文将讨论Go的渣滓搜集器、运行程序内存优化以及如何防止OOM(Out-Of-Memory)失误。 Go...

的原因-Go-Map-语言不支持并发读写 (的原因英语)

的原因-Go-Map-语言不支持并发读写 (的原因英语)

在Go语言的设计中,为了防止数据竞态,不同于一些其他语言,map并没有提供内置的锁机制。这样设计的目的是为了鼓励开发者使用更加精细的同步措施,以适应不同的并发场景。 Map的数据结构...

内存效率-多用途-语言中使用切片代替数组的优点-动态大小-Go (内存使用效率)

内存效率-多用途-语言中使用切片代替数组的优点-动态大小-Go (内存使用效率)

引言 在 Go 语言中,数组是一种固定长度的数据结构,而切片则是一种可变长度的数据结构。虽然数组和切片都可以存储相同类型的数据元素,但切片在使用上有其独到的优势,本文将通过介绍切片的特性来解释为...