当前位置: GO > golang 多种限流器实现

golang 多种限流器实现

2023-05-13 分类:GO 作者:admin 阅读(20)

限流
日常开发中,一般会遇到几种场景需要限流,比如有个api-server, 需要限制单个用户的调用频率,避免用户恶意刷接口或者突发大流量导致服务不可用等,这边记录几个常用的限流方法。
并发控制
简单的并发控制,用户的所有请求丢到一个channel里,再指定一个带缓冲区的channel为并发池,缓冲池的长度就是可以同时存在的协程数量,然后将执行完的任务根据需要直接返回或者丢到另外一个channel 里, 这样做的问题是如果任务太多,后面的任务会慢慢等待(因为channel阻塞机制),用户体验不是太好。
Code:

    PS:先把所有请求都放入channel,至关重要。
    漏桶
    简单的限流,指定一个大小固定的桶(bucket),以指定速率流入流出,如果桶满了,则拒绝后续请求,好处是简单,但是由于rate是固定的,导致了在无法在业务突发高峰时候(比如活动期间)有比较好的适配性。
    Code:
    令牌桶
    令牌桶相比漏桶可以对突发的流量做一定程度的处理,该方法意思是一定速率往一个桶里放令牌(token),同时往桶里注水,每消耗一滴水,需要一定数量的令牌,这里代码假设需要2块令牌才能消耗1滴水,所以处理水滴的速度主要取决于令牌的数量。假设放入令牌的速度是4块/s,每秒消耗的水滴数量是1滴,即每秒消耗2块令牌,那么每秒多出来的2块令牌就会积累在桶里,直到桶满位置,然后因为某次活动大放水,每秒消耗的水滴数量突然变成了3滴,即每秒需要消耗6块另外,大于每秒放入的令牌数量,由于之前桶里有积累的令牌,所以即使放水量加大,依然可以在令牌桶消耗完之前快速处理。
    Code:
    转自:https://blog.51cto.com/u_2010293/2781897
    使用golang标准库实现令牌桶,更加简单:http://biji.jinli.vip/791.html

    漏桶算法

    • 请求处理:当漏桶满了(即存储请求的桶达到最大容量),新的请求会被丢弃或拒绝。这意味着在高流量时,可能会导致请求的丢失。
    • 输出速率:请求以固定速率从桶中“漏出”,无论输入流量如何,输出都是恒定的。

    令牌桶算法

    • 请求处理:当桶中没有令牌时,请求不会被丢弃,而是会被阻塞或等待,直到有令牌可用。这意味着即使在高流量情况下,系统也不会丢失请求。
    • 输出速率:请求的处理速率可以根据令牌的生成速率变化,允许短时间内处理更多请求,只要桶中有足够的令牌。

    总结

    • 漏桶算法:一旦桶满,新的请求会被丢弃,适用于需要严格控制流量的场景。
    • 令牌桶算法:请求会被阻塞,直到有令牌可用,适用于需要处理突发流量的场景。

    这种设计上的差异使得令牌桶算法在处理流量波动时更具灵活性,而漏桶算法则更适合于对流量有严格要求的情况。

    「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

    赞(0) 打赏

    支付宝
    微信
    0

    支付宝
    微信
    标签:

    上一篇:

    下一篇:

    你可能感兴趣

    共有 0 - golang 多种限流器实现

    博客简介

    精彩评论

    • admin(6年前 (2020-03-09))

      分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

      评:新文章!
    • admin(6年前 (2020-03-09))

      分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

      评:新文章!
    • admin(6年前 (2020-03-09))

      新增一个框架图! http://biji.jinli.vip/wp-content/upl...

      评:新文章!
    • 一位WordPress评论者(6年前 (2020-02-13))

      嗨,这是一条评论。 要开始审核、编辑及删除评论,请访问仪表盘的“评论”页面。 评论者头像来自...

      评:世界,您好!