2 回答
TA贡献1865条经验 获得超7个赞
从费率文档:
func NewLimiter(r Limit, b int) *Limiter
NewLimiter 返回一个新的限制器,它允许事件的速率达到 r 并允许最多 b 个令牌的突发。
所以第一个参数是速率限制,而不是第二个。Burst 是您希望允许发生的请求数量快于速率限制 - 通常使用一个值1来禁止突发,任何更高的值都会在常规速率限制启动之前允许此数量的请求。无论如何.. .
要根据rate.Limit您的需要创建,您可以使用辅助函数rate.Every():
rt := rate.Every(24*time.Hour / 50)
limiter := rate.NewLimiter(rt, 1)
TA贡献1776条经验 获得超12个赞
NewLimited(1, 50)表示 1 个请求/秒,最多 50 个请求。它是一个令牌桶,这意味着有 50 个令牌,每个接受的 API 调用使用一个令牌,并且令牌以给定的速率重新生成,最多burst. 您的代码正在为每个 IP 地址创建一个限制器,因此这是每个 IP 地址的限制(我猜您将其近似为一个 IP 地址是一个用户)。
如果您在单个持久服务器上运行,并且服务器和代码永远不会重新启动,那么您可以通过指定速率50 / (3600*24)和 50 的突发来获得每个用户每天 50 个请求。(注意:3600*24是一天中的秒数)。但是您正在使用的速率限制包并不是为这种粗略的速率限制而设计的(按每天请求的顺序)——它旨在防止服务器在短期内因流量过大而过载(按每秒请求的顺序) )。
您可能需要一个可与数据库或类似工具一起使用的速率限制器(可能使用令牌桶方案,因为这可以有效地实现)。可能在某个地方有一个包裹,但我不知道我的头顶有一个。
- 2 回答
- 0 关注
- 279 浏览
添加回答
举报
