How does golang limit current in high-concurrency scenarios
import "golang.org/x/time/rate"
// 每秒最多30次放行
var l = rate.NewLimiter(1, 30)
func TestExecLimit2(t *testing.T) {
runtime.GOMAXPROCS(runtime.NumCPU())
go func() {
for {
ExecLimit2(l, func() {
fmt.Println("do")
})
}
}()
select {
case <-time.After(1 * time.Second):
fmt.Println("1秒到时")
}
}
func ExecLimit2(l *rate.Limiter, f func()) {
go func() {
l.Wait(context.Background())
f()
}()
}
Current limiting middleware
func LimitRate(r *rate.Limiter) gin.HandlerFunc {
return func(c *gin.Context) {
r.Wait(context.Background())
c.Next()
}
}
use
var l = rate.New(1,50)
// 购买接口1秒内只允许50个请求
r.POST("/second-kill-shop/buy/", LimitRate(l), buyShop)