`

流量调整和限流技术

    博客分类:
  • web
 
阅读更多

copy from http://blog.csdn.net/glory1234work2115/article/details/51674985

在早期的计算机领域,限流技术(time limiting)被用作控制网络接口收发通信数据的速率。 可以用来优化性能,减少延迟和提高带宽等。 现在在互联网领域,也借鉴了这个概念, 用来为服务控制请求的速率, 如果双十一的限流, 12306的抢票等。 即使在细粒度的软件架构中,也有类似的概念。

两种常用算法

令牌桶(Token Bucket)和漏桶(leaky bucket)是 最常用的两种限流的算法。

漏桶算法

它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 用说人话的讲:

漏桶算法思路很简单,水(数据或者请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。

在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使某一个单独的流突发到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法可以结合起来为网络流量提供更大的控制。

令牌桶算法

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 令牌桶的另外一个好处是可以方便的改变速度。 一旦需要提高速率,则按需提高放入桶中的令牌的速率。 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量, 比如华为的专利"采用令牌漏桶进行报文限流的方法"(CN 1536815 A),提供了一种动态计算可用令牌数的方法, 相比其它定时增加令牌的方法, 它只在收到一个报文后,计算该报文与前一报文到来的时间间隔内向令牌漏桶内注入的令牌数, 并计算判断桶内的令牌数是否满足传送该报文的要求。

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

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

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

 

还有,公开 API 接口服务,Rate limiting 应该是一个必备的功能,否则公开的接口不知道哪一天就会被服务调用方有意无意的打垮。

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

常见的 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;
    }

 

详细参见:  ngx_http_limit_req_module

Haproxy 提供的功能

详细参见:  Haproxy Rate limit 模块

 

RateLimiters是令牌桶和漏桶在.NET 中实现。这些策略可用于速率限制请求不同的网站中,后端或 API 调用等场景。

 

ASP.NET Web API rate limiter for IIS and Owin hosting

基于 Redis 功能的实现

这个在 Redis 官方文档有非常详细的实现。一般适用于所有类型的应用,比如 PHP、Python 等等。Redis 的实现方式可以支持分布式服务的访问频率的集中控制。Redis 的频率限制实现方式还适用于在应用中无法状态保存状态的场景。

参见:Redis INCR rate limiter

 

网上有众多关于这方面的文章,这里列出了本文参考的一些文档。

  1. http://en.wikipedia.org/wiki/Token_bucket
  2. http://en.wikipedia.org/wiki/Leaky_bucket
  3. http://www.cnblogs.com/LBSer/p/4083131.html
  4. http://www.cnblogs.com/mushroom/p/4659200.html
  5. 电商课题I:集群环境下业务限流
分享到:
评论

相关推荐

    web服务器如何限流-nginx,tomcat服务器如何限制流量

    观察服务器的响应时间和错误率,可以帮助调整限流策略。 另外,限流算法中的一种常见模型是“令牌桶”算法。简单来说,它维护一个装满令牌的桶,每次处理请求时需要消耗一个令牌,如果没有令牌则请求被限制。这种...

    net core 设置接口限流

    本文将深入探讨如何在.NET Core中设置接口限流,以及相关的技术实现。 首先,我们需要理解限流的基本概念。限流是网络应用中的流量控制策略,它限制了在特定时间窗口内可以处理的请求数量,超过这个限制的请求会被...

    亿级流量下的分布式限流解决方案.rar

    - 动态调整:根据系统负载和业务需求动态调整限流阈值。 - 层级限流:在不同层次(如入口、服务、数据库)设置限流,逐层过滤。 - 基于优先级的限流:优先保障关键业务,非关键业务可适当牺牲。 6. 实施策略: ...

    基于redis限流系统

    还可以结合服务发现机制动态调整限流策略,根据服务实例的负载情况自动调整限流阈值。 综上所述,基于Redis的限流系统利用了Redis的数据结构和原子操作特性,能够有效地实现各种限流策略,保护系统免受大流量冲击。...

    基于Zookeeper和guava动态限流 源码

    2. Guava RateLimiter的使用示例,展示如何根据Zookeeper中的配置创建和调整限流器。 3. 可能还会有相关的测试代码,用于验证限流功能的正确性。 安装Zookeeper通常涉及下载其二进制包,配置环境变量,以及启动...

    Java限流实现

    工具方面,除了上述库,还有一些可视化监控工具,如Prometheus和Grafana,可以帮助我们实时监控和调整限流参数,确保系统的稳定运行。 至于"lib包",这通常指的是项目中的依赖库文件夹,里面可能包含上述提到的...

    hyxtrix限流.zip

    同时,Hystrix还提供了丰富的监控和度量工具,如Hystrix Dashboard和Turbine,它们可以帮助开发者实时查看服务的运行状态,包括成功率、响应时间和熔断次数等,以便及时调整限流策略。 在压缩包中的"hyxtrix限流...

    分布式限流面试专题系列:Nginx+zookeeper.zip

    这些算法可以帮助我们根据业务需求调整限流策略。 3. **Zookeeper**:Apache ZooKeeper是一个分布式协调服务,提供统一命名服务、配置管理、集群同步等。在分布式限流中,Zookeeper可以作为共享数据存储,存储限流...

    activemq限流排队

    总的来说,关于“activemq限流排队”的知识点涵盖了如何在ActiveMQ中实现流量控制,如何通过配置和策略调整来优化系统性能,以及阅读源码和使用相关工具对于理解与改进这一机制的重要性。为了更深入地学习,可以参考...

    分布式限流面试专题系列:Nginx+zookeeper.rar

    这样,当系统扩展或调整限流规则时,无需修改所有服务,只需更改Zookeeper中的配置即可。 在Java开发中,我们常常会用到开源库如Hystrix、Sentinel或者Resilience4j来实现限流。这些库提供了丰富的限流策略,比如...

    dubbo服务限流与负载均衡

    总结来说,Dubbo服务限流和负载均衡是保障系统健壮性和高效运行的关键技术。服务限流可以避免系统因突发流量而崩溃,而负载均衡则能够充分利用服务资源,提高服务的整体处理能力。在实际应用中,开发者应根据业务...

    用于部署在OpenResty上的分流限流控制脚本,基于配置策略进行工作,可以通过管理URI实时调整配置生效

    - 监控系统性能,根据实际流量情况调整限流策略。 - 对关键服务或高优先级用户设置优先级限流。 - 设定合理的回退策略,如请求队列、延迟执行等,以防过载时优雅地拒绝服务。 8. **安全考虑** - 避免过度限流...

    QoS技术介绍 流分类、流量监管和流量整形 拥塞管理

    - **聚合CAR**(Classified Aggregate Rate Limiting):结合流分类和流量监管功能,为一组流量提供统一的速率限制。 - **流镜像**(Stream Mirroring):复制流量到另一个端口或设备,用于监控或测试目的。 - **DAR...

    利用路由器自适应限流防御分布拒绝服务攻击(英文).pdf

    这意味着路由器不仅仅执行静态的流量控制规则,而是通过智能算法,根据网络的实时状态来调整限流策略。这种技术通常基于最大最小公平原则,即在保证每个网络流都能获得一定带宽资源的同时,尽可能平均地分配服务器的...

    行业分类-设备装置-一种截流限流系统.zip

    本压缩包文件"一种截流限流系统.zip"包含了一份详细的资料——"一种截流限流系统.pdf",它深入探讨了一种独特的截流限流技术,该技术对于优化流量控制和保障设备安全运行具有显著的意义。 截流限流系统,顾名思义,...

    【系统设计】设计一个限流组件.doc

    【系统设计】设计一个限流组件 限流组件在IT系统中扮演着至关重要的角色,其主要目的是控制和管理服务的资源使用,确保系统稳定性和用户体验...同时,限流策略应具备动态调整的能力,以适应业务变化和系统负载的变化。

    基于spring cloud alibaba sentinel实现的服务限流详解

    这使得我们能够根据实际流量情况实时调整限流策略。 6. **异常处理**:Sentinel提供了丰富的异常处理回调,如降级处理、超时处理和熔断处理。通过定义降级规则,当服务不可用时,可以选择返回默认值、快速失败或...

    对API接口限流.zip

    Sentinel提供了丰富的控制台,可以实时监控和调整限流策略。 3. **Hystrix限流与熔断**:Hystrix是Netflix开源的一个库,用于实现服务的容错管理,包括限流、熔断和降级。在Spring Boot应用中,我们可以为每个API...

    13 秒杀和限流的介绍1

    秒杀和限流是互联网应用中常见的两种技术手段,它们主要应用于高并发场景,如电商平台的限时抢购、促销活动等。本篇文章将详细介绍基于Redis的秒杀方案以及两种限流算法:漏桶算法和令牌桶算法。 首先,让我们探讨...

Global site tag (gtag.js) - Google Analytics