当前位置: 首页 > news >正文

太原富库网站建设网络广告电话

太原富库网站建设,网络广告电话,做问卷调查赚钱的网站好,网站在电脑与wap显示一样实施速率限制器的位置主要取决于我们的应用程序、技术栈、技术团队等因素。通常有三个位置可供选择:客户端、服务器端或中间件。 客户端是不可靠的地方来执行速率限制,因为恶意行为者可以轻易伪造客户端请求。 比将速率限制器放在服务器端更好的方法是使…

实施速率限制器的位置主要取决于我们的应用程序、技术栈、技术团队等因素。通常有三个位置可供选择:客户端、服务器端或中间件。

客户端是不可靠的地方来执行速率限制,因为恶意行为者可以轻易伪造客户端请求。

比将速率限制器放在服务器端更好的方法是使用速率限制器中间件,它甚至可以对我们的服务器端进行限流。因此,如果您正在使用微服务架构,并且已经使用类似身份验证中间件的功能,则可以在其旁边实现速率限制器中间件。

75500ea6aa67478a2a4d0a9426000d0b.png

有许多速率限制算法可供选择:我们将介绍一些算法,包括“令牌桶”、“漏桶”、“滑动窗口计数器”等。

令牌桶算法

Stripe (点击此处阅读)[1] 使用令牌桶算法来限制他们的 API 请求。

根据 Stripe 技术博客:

我们使用令牌桶算法来执行速率限制。这个算法有一个中央的桶主机,你每次请求时都从中取出令牌,并慢慢地向桶中滴入更多令牌。如果桶是空的,就拒绝请求。在我们的情况下,每个 Stripe 用户都有一个桶,每次他们发出请求时,我们就从那个桶中删除一个令牌。我们使用 Redis 实现我们的速率限制器。

39d8f6564bb1d8ab678790dad0c8e4e5.png

桶中有预定义容量的令牌。当请求到达时,它从桶中取出一个令牌并进一步处理。如果没有令牌可供获取,则请求将被丢弃,用户将不得不重试。

示例用例:

•我们将速率限制规则设置为每个用户每分钟 3 个请求。•用户1在 00 时间间隔发出请求,当前桶已满,有 3 个令牌,因此请求将被处理。现在桶中的令牌数量更新为 2。•用户1在第 10 秒发出第二个请求,桶中有 2 个令牌,所以请求将进一步处理。现在桶中的令牌数量更新为 1。•用户1在第 30 秒发出第三个请求,桶中有 1 个令牌,所以请求将进一步处理。现在整整 1 分钟内桶都为空。•用户1在第 55 秒发出第四个请求,桶中没有令牌,因此请求被限制,用户将收到 429 状态码 - 请求太多,并被要求稍后重试。HTTP 429 Too Many Requests 响应状态码表示用户在给定的时间内发送了太多请求。•在那 1 分钟的完成时,令牌计数以固定速率刷新,并且桶再次装满了 3 个令牌,可以再次为该特定用户处理请求。

简单来说:

在令牌桶算法中,我们每次请求都会从桶中处理一个令牌。新令牌以速率 r 放入桶中。桶最多可以容纳 b 个令牌。如果请求到来时桶已满,则该请求将被丢弃。

令牌桶算法需要两个参数:

81a76f037f39812886e043eac1ee526d.png

令牌桶算法代码示例

package mainimport ("fmt""math""time"
)const (MAX_BUCKET_SIZE float64 = 3REFILL_RATE     int     = 1
)type TokenBucket struct {currentBucketSize   float64lastRefillTimestamp int
}func (tb *TokenBucket) allowRequest(tokens float64) bool {tb.refill() //refill of bucket happening at constant REFILL_RATEif tb.currentBucketSize >= tokens {tb.currentBucketSize -= tokensreturn true}return false
}func getCurrentTimeInNanoseconds() int {return time.Now().Nanosecond()
}func (tb *TokenBucket) refill() {nowTime := getCurrentTimeInNanoseconds()tokensToAdd := (nowTime - tb.lastRefillTimestamp) * REFILL_RATE / 1e9tb.currentBucketSize = math.Min(tb.currentBucketSize+float64(tokensToAdd), MAX_BUCKET_SIZE)tb.lastRefillTimestamp = nowTime
}func main() {obj := TokenBucket{currentBucketSize:   3,lastRefillTimestamp: 0,}fmt.Printf("Request processed: %v\n", obj.allowRequest(1)) //truefmt.Printf("Request processed: %v\n", obj.allowRequest(1)) //truefmt.Printf("Request processed: %v\n", obj.allowRequest(1)) //truefmt.Printf("Request processed: %v\n", obj.allowRequest(1)) //false, request dropped
}

Leaky Bucket Algorithm

Leaky Bucket是使用队列实现速率限制的一种简单直观的方式。它是一个先进先出的队列(FIFO)。进来的请求被附加到队列中,如果没有足够的空间容纳新的请求,则会被丢弃(泄漏)。

2cfc1632ba54d8a8c2b53647056d3f5c.png

•当一个请求到达时,系统检查队列是否已满。如果没有满,则将请求添加到队列中。•否则,请求将被丢弃。•请求以固定的间隔从队列中提取并处理。

算法的工作原理:

d7230a414f5d7cdf86187f353f18731a.png

泄漏桶算法接受以下两个参数:

•桶大小:等于队列大小。队列保存要以固定速率处理的请求。•流出速率:定义在固定速率内可以处理多少请求,通常以秒为单位。

该算法的优点是,它平滑处理请求的突发,并以大致平均的速率处理它们。

Sliding Window Algorithm

•该算法跟踪请求的时间戳。时间戳数据通常保存在缓存中,例如 Redis 的有序集合。•当一个新请求到来时,删除所有过期的时间戳。过期的时间戳被定义为早于当前时间窗口的开始时间。•将新请求的时间戳添加到日志中。•如果日志大小与允许的请求数相同或更低,则接受请求。否则,拒绝该请求。

2858fb4b8611ad48b5b877268fbe43e7.png

在下面的示例中,速率限制器允许我们每分钟2个请求。窗口内超出此限制的请求将被丢弃。

c7932999503df19c9cc522c8c6a2c478.png

注意: 为了便于理解,我们使用了hh:mm:ss格式,但在redis中,我们将推送UNIX时间戳。

•当一个新请求在1:00:01到达时,日志为空。因此,请求被允许。•一个新请求在1:00:30到达,时间戳1:00:30被插入日志中。插入后,日志大小为2,不大于允许的请求数。因此,请求被允许。•一个新请求在1:00:50到达,时间戳被插入到日志中。插入后,日志大小为3,大于允许的大小2。因此,该请求被拒绝,即使时间戳仍然存在于日志中。•一个新请求在1:01:40到达。在[1:00:40,1:01:40)范围内的请求在最新时间范围内,但在1:00:40之前发送的请求已过时。两个过时的时间戳1:00:01和1:00:30从日志中删除。删除操作后,日志大小变为2;因此,该请求被接受。

速率限制器的详细设计:

我们将使用以下组件:

•配置和数据存储来存储速率限制器规则。•工作进程经常从磁盘中获取规则并将其存储在缓存中。•速率限制器中间件从缓存中获取规则。它还从Redis中获取时间戳、计数器等数据。当请求到来时,它进行计算并决定是处理该请求还是对其进行速率限制。•如果需要对请求进行速率限制,这里有两个选项•选项1:拒绝请求并向客户端发送状态代码429: too many requests。•选项2:将请求推送到消息队列以稍后处理该请求。

35c334e6d02b9e65246964295919e5ec.png

现在,我们可能需要将以上系统扩展到分布式环境中,以支持多个服务器和并发线程。这里可能会出现两个挑战:

竞争条件

如上所述:

从Redis中读取计数器值,检查(计数器+1)是否超过阈值。如果没有,将计数器值在Redis中增加1。

ae35066bdddf948009dc18d1add03243.png

假设Redis中的计数器值为3(如上图所示)。如果两个请求并发读取计数器值,而在任一请求写回值之前,都不检查另一个线程。它们都会将计数器增加1并写回,而不会检查其他线程。两个请求(线程)都认为它们有正确的计数器值4。但是,正确的计数器值应该是5。

锁可以在这里使用,但这可能会影响性能。因此,我们可以使用Redis Lua脚本[2]

•这可能会导致更好的性能。•此外,脚本中的所有步骤都以原子方式执行。在脚本执行时,没有其他Redis命令可以运行。

同步

在分布式环境中,同步是另一个需要考虑的重要因素。为了支持数百万用户,一个速率限制服务器可能无法处理流量。当使用多个速率限制服务器时,需要同步。

一种可能的解决方案是使用黏性会话,允许客户端将流量发送到相同的速率限制器。这种解决方案既不可扩展也不灵活。更好的方法是使用像Redis这样的集中式数据存储。

在所有事情都就绪之后,我们还可以监视我们的速率限制器以获取性能、规则、算法有效性等指标。例如,如果速率限制规则过于严格,会丢弃许多有效请求。在这种情况下,我们希望稍微放松一下规则。在另一个例子中,我们注意到当有突然增加的流量,如抢购时,我们的速率限制器变得无效。在这种情况下,我们可以更改算法以支持突发流量。令牌桶在这里非常合适。

引用链接

[1] (点击此处阅读)https://stripe.com/blog/rate-limiters
[2] Redis Lua脚本: https://www.freecodecamp.org/news/a-quick-guide-to-redis-lua-scripting/


文章转载自:
http://dinncoshirtwaist.ssfq.cn
http://dinncopoland.ssfq.cn
http://dinncomongrel.ssfq.cn
http://dinncohaematinic.ssfq.cn
http://dinncoparavent.ssfq.cn
http://dinncoreductivist.ssfq.cn
http://dinncohousecleaning.ssfq.cn
http://dinncosideway.ssfq.cn
http://dinncoforegift.ssfq.cn
http://dinncodiscrete.ssfq.cn
http://dinncociseaux.ssfq.cn
http://dinncoleguminous.ssfq.cn
http://dinnconarrowband.ssfq.cn
http://dinncosimple.ssfq.cn
http://dinncotoxicomania.ssfq.cn
http://dinncovalidation.ssfq.cn
http://dinncocark.ssfq.cn
http://dinncomontaignesque.ssfq.cn
http://dinncosixpence.ssfq.cn
http://dinncopunk.ssfq.cn
http://dinncoethiop.ssfq.cn
http://dinncoanimadversion.ssfq.cn
http://dinncoontological.ssfq.cn
http://dinnconaderite.ssfq.cn
http://dinncoactualist.ssfq.cn
http://dinncogop.ssfq.cn
http://dinncoelbowchair.ssfq.cn
http://dinncotraffic.ssfq.cn
http://dinncoschizophrenese.ssfq.cn
http://dinncozionism.ssfq.cn
http://dinncobeneficiation.ssfq.cn
http://dinncojapanization.ssfq.cn
http://dinncothivel.ssfq.cn
http://dinncoeuonymus.ssfq.cn
http://dinncoexhaustible.ssfq.cn
http://dinncoextension.ssfq.cn
http://dinncozn.ssfq.cn
http://dinncounhesitating.ssfq.cn
http://dinncopastorale.ssfq.cn
http://dinncojal.ssfq.cn
http://dinncoperplex.ssfq.cn
http://dinncohitchhike.ssfq.cn
http://dinncoantipatriotic.ssfq.cn
http://dinncoethiopian.ssfq.cn
http://dinncocavum.ssfq.cn
http://dinncocorroboree.ssfq.cn
http://dinncojive.ssfq.cn
http://dinncoideomotor.ssfq.cn
http://dinncokarakorum.ssfq.cn
http://dinncoflightiness.ssfq.cn
http://dinncoentryway.ssfq.cn
http://dinncofestivous.ssfq.cn
http://dinncocamptothecin.ssfq.cn
http://dinncosaddlery.ssfq.cn
http://dinncoilliberally.ssfq.cn
http://dinncojism.ssfq.cn
http://dinncobutyral.ssfq.cn
http://dinncopitching.ssfq.cn
http://dinncomilano.ssfq.cn
http://dinncocomprisable.ssfq.cn
http://dinncosuety.ssfq.cn
http://dinncodenationalize.ssfq.cn
http://dinncopalmetto.ssfq.cn
http://dinncohautbois.ssfq.cn
http://dinncoessential.ssfq.cn
http://dinncorecharge.ssfq.cn
http://dinncounuseful.ssfq.cn
http://dinncopronounceable.ssfq.cn
http://dinncosubspecies.ssfq.cn
http://dinncofluidextract.ssfq.cn
http://dinncohowitzer.ssfq.cn
http://dinncoflannelled.ssfq.cn
http://dinncowestwards.ssfq.cn
http://dinncoblanket.ssfq.cn
http://dinncopuppyism.ssfq.cn
http://dinncosarcomata.ssfq.cn
http://dinncopaedomorphism.ssfq.cn
http://dinnconovaculite.ssfq.cn
http://dinncowildling.ssfq.cn
http://dinncomatchstick.ssfq.cn
http://dinncobravest.ssfq.cn
http://dinncodisclose.ssfq.cn
http://dinncovina.ssfq.cn
http://dinncometestrus.ssfq.cn
http://dinncoeurybenthic.ssfq.cn
http://dinncoascariasis.ssfq.cn
http://dinncopipsqueak.ssfq.cn
http://dinncoendogenic.ssfq.cn
http://dinncocross.ssfq.cn
http://dinncoteknonymy.ssfq.cn
http://dinncoyamulka.ssfq.cn
http://dinncotrailside.ssfq.cn
http://dinncospaceman.ssfq.cn
http://dinncocosmogony.ssfq.cn
http://dinncoherbartian.ssfq.cn
http://dinncoinweave.ssfq.cn
http://dinncopreaxial.ssfq.cn
http://dinncohypoxemic.ssfq.cn
http://dinncoleaved.ssfq.cn
http://dinncokhowar.ssfq.cn
http://www.dinnco.com/news/92884.html

相关文章:

  • 什么网站可以做实验室郑州seo技术培训班
  • 一个主体可以备案几个网站seo优化一般包括哪些
  • wpbus-d4 wordpress theme优化网站排名费用
  • 做网站图片软件谷歌chrome浏览器官方下载
  • 专做项目报告的网站代发关键词包收录
  • 婚庆网站策划书网站推广系统方案
  • 微网站建设包含真正免费的网站建站平台
  • 建设网站及域名费用陕西网站设计
  • 手机网站返回跳转页面代码微博seo排名优化
  • 建设视频网站的视频源网站产品怎么优化
  • 顺德微网站建设站长工具的使用seo综合查询排名
  • 比较好的企业网站在线子域名二级域名查询工具
  • 移动网站怎么做360开户推广
  • 如何做电商网站首页淘宝网页版
  • 网站建设开发的主要流程google play谷歌商店
  • 中国国际空间站拒绝十个国家seo文章
  • 怎样做网站认证在线看crm系统
  • 做技术网站在背景图天津企业seo
  • 太原今日头条新闻最新seo排名哪家公司好
  • 群晖wordpress默认地址网站排名优化查询
  • 哪些网站做舆情分析成年s8视频加密线路
  • wordpress批量插件西安网站seo优化公司
  • 企业网站样式日照网站优化公司
  • 供应邯郸专业做网站个人如何做seo推广
  • 淘宝客怎么做推广网站附近哪里有计算机培训班
  • 建网站投放广告赚钱沐浴露营销软文
  • 品牌网站建是啥重庆seo推广公司
  • 福田庆三baby案例照行者seo
  • 一般在百度做网站多少钱电商培训机构有哪些?哪家比较好
  • 合肥设计网站网站外链有多重要