滑动窗口限流:
优点:细分时间精度可以避免请求超过阈值,可以应对简单的突发流量
缺点:使用内存或者redis来维护窗口,如果时间颗粒度太细,会造空间容量过大。
漏桶限流:
令牌桶限流:
自适应限流:
优点:可以根据硬件配置,设置load 或者 cpu 占用率,根据设置的cpu占用率和load 阈值, 获取过去一段时间内的请求数量。将这个数量作为限流,如果系统负载达到这个显示,将这个请求数量作为请求阈值。
缺点:根据系统资源利用率进行限流,会因为其它程序或进程的高cpu占用率触发限流。这部分可以采用docker 封装,获取docker 的相关占用率进行避免。
参考:
kratos/ratelimit.md at v1.0.x · go-kratos/kratos (github.com)
抽象接口:
type GFLimiter interface { ShouldAllow() bool //是否允许 accept() error //通过函数 reject() error //拒绝函数 } |
完成两种限流方式(令牌桶限流和自适应限流),原因如下: