资讯专栏INFORMATION COLUMN

Rate limiting限流

buildupchao / 741人阅读

摘要:大部分人都知道应该增加,做请求频率限制。假如超过服务能力,一般会造成整个接口服务停顿,或者应用,或者带来连锁反应,将延迟传递给服务调用方造成整个系统的服务能力丧失。有必要在服务能力超限的情况下。这就要求在应用层实现限制。

Rate limiting

RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。

从最终用户访问安全的角度看,设想有人想暴力碰撞网站的用户密码;或者有人攻击某个很耗费资源的接口;或者有人想从某个接口大量抓取数据。大部分 人都知道应该增加 Rate limiting,做请求频率限制。从安全角度,这个可能也是大部分能想到,但不一定去做的薄弱环节。

从整个架构的稳定性角度看,一般 SOA 架构的每个接口的有限资源的情况下,所能提供的单位时间服务能力是有限的。假如超过服务能力,一般会造成整个接口服务停顿,或者应用 Crash,或者带来连锁反应,将延迟传递给服务调用方造成整个系统的服务能力丧失。有必要在服务能力超限的情况下 Fail Fast。

另外,根据排队论,由于 API 接口服务具有延迟随着请求量提升迅速提升的特点,为了保证 SLA 的低延迟,需要控制单位时间的请求量。这也是 Little’s law 所说的。

所以,提供资源能够支撑的服务,将过载请求快速抛弃对整个系统架构的稳定性非常重要。这就要求在应用层实现 Rate limiting 限制。

Proxy 层的实现,针对部分 URL 或者 API 接口进行访问频率限制

Nginx 模块

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5;
    }

配置解释

Java应用层实现

Google Guava 提供了一个 RateLimiter 实现

/**
 * Created by haoting.wang on 2017/3/13.
 */
public class RateLimiterDemo {
    
    //每秒处理一个
    static RateLimiter rateLimiter = RateLimiter.create(1);
    private static int count = 10;
    static class Work implements Runnable{

        int name;
        Work(int name){
            this.name = name;
        }
        public void run() {
                rateLimiter.acquire();
                System.out.println(name+"正在工作");
        }
    }
    public static void main(String[] args){
        for(int i = 0; i

但是更好的限制方式是池, 线程池、数据库连接池来限制访问数量,将过载的请求放在队列中,等待线程资源

这坑比啊 segmentfault,连个限流的标签都没,建个标签还要声望。mdzz

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39472.html

相关文章

  • 使用Envoy 作Sidecar Proxy的微服务模式-5.rate limiter

    摘要:为安装过滤器的侦听器上的每个新请求调用服务,路由表指定应调用服务。使用了令牌桶算法来限流。 本博客是深入研究Envoy Proxy和Istio.io 以及它如何实现更优雅的方式来连接和管理微服务系列文章的一部分。 这是接下来几个部分的想法(将在发布时更新链接): 断路器(第一部分) 重试/超时(第二部分) 分布式跟踪(第三部分) Prometheus的指标收集(第四部分) rate ...

    CocoaChina 评论0 收藏0
  • Spring Cloud Gateway限流实战

    摘要:欢迎访问我的欢迎访问我的内容所有原创文章分类汇总及配套源码,涉及等本篇概览本篇概览本文是实战系列的第八篇,经过前面的学习,咱们对过滤器已了解得差不多,今天来补全过滤器的最后一个版块限流默认的限流器是基于实现的,限流算法是大家熟悉的令牌桶关于欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容:所有原创文章分类汇总及配套源码,涉及Java、Doc...

    stonezhu 评论0 收藏0
  • 【Nginx源码研究】nginx限流模块详解

    摘要:限流算法最简单粗暴的限流算法就是计数器法了,而比较常用的有漏桶算法和令牌桶算法计数器计数器法是限流算法里最简单也是最容易实现的一种算法。 运营研发团队 李乐 高并发系统有三把利器:缓存、降级和限流; 限流的目的是通过对并发访问/请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页)、排队等待(秒杀)、降级(返回兜底数据或默认数据); 高并发系统常见的限流有:限制总并发...

    voyagelab 评论0 收藏0
  • Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

    摘要:但是比较可惜的是已经宣布对停止更新。客户端整合每个微服务客户端都需要整合的客户端封装与配置,才能将监控信息上报给展示以及实时的更改限流或熔断规则等。下面我们就分两部分来看看,如何使用来实现接口限流。 最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒。及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba。 Nacos作为注册中心和配置中心的基础教程,...

    stefanieliang 评论0 收藏0
  • 【工程化】限流

    摘要:限流,是对流量控制。基于时间的滑动窗口,参照于滑动窗口,将单位时间看做是一个窗口,将窗口中的每个格子设定为指定时间间隔,为格子总数,那么单位时间就是。很明显格子划分的越多,滑动窗口的滑动就越平滑,限流统计就越精确。 介绍 限流,在一些我们已知的场景有: 1)在Tcp协议中,Flow Control, 流量控制以动态调整发送空间大小(滑动窗口)的形式来反映接收端接收消息的能力,反馈给发送...

    calx 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<