全局流控

一、描述:

控制集群范围内接口每秒钟的有效请求数,例如有一个500台应用的系统集群,现预测数据库集群能够支持的最大的qps是10000【通过压测来判断数据库达到瓶颈时能够支持的访问量】,接口需要访问数据库那么可以判断出系统的压力主要在数据库上,而不在应用上,因此需要对请求进行流量控制防止数据库压力过大,这个时候就可以通过全局流控来保护数据库。

二、特点:

1、粒度控制到接口

2、阈值位接口总阈值

3、支持双机房分开控制

4、依赖redis服务

三、使用场景:

1.保护整体服务请求

2.适用于流量较小的服务

3.需要精确进行tps流控

4.适用于交易线:交易链路像加车、提交订单、支付等操作,而非浏览线像首页、四级页、搜索查询之类的。

四、使用举例:

1、机器无压力,主要压力在库,可设置全局流控。

2、适用于对整体TPS有要求的流控限制,如某个接单接口只能接入5000tps,如果tps大了会造成下游系统问题,此时就不适用于分布式流控,可采用全局流控。

五、实现思路和原理

1、判断当前时间秒接口流控状态,如果已经被流控直接返回,如果未流控做流控判断和配额扣减处理

2、从本地配额缓存中获取接口当前秒key的配额ConcurrentHashMap<key, 配额对象>

3、如果当前秒key对应的配额对象不存在:从redis获取当前时间秒对应接口的配额,redis key为interface_code_secondKey, value 为 全局的配额。

从redis获取配额的操作为原子操作,如下所示

String sha1 = loadScript(timeKey,"local key=KEYS[1];" +"local valve=KEYS[2];" +"local step=KEYS[3];" +"local expire=KEYS[4];" +"local remnant;" +"local exists=redis.call(\"EXISTS\",key);" +"if(exists==1) then remnant=redis.call(\"DECRBY\",key,step);" +"else remnant=redis.call(\"DECRBY\",key,(step-valve));" +"redis.call(\"EXPIRE\",key,expire);end return remnant;");

脚本中变量介绍 value: 全局流控的阈值; step: 每次拉取时给应用分配的配额【本次申请的配额】; expire:过期时间; remnant:全局配额剩余数量;

​ 先判断key是否存在,key不存在新建key并扣除本次拉取的配额, key存在则直接扣除本次拉取的配额,返回总的配额余额。

​ (1)如果总的配额余额>=0说明配额充足, 说明本次应用申请的配额可以满足,更新本地配额为申请的配额;

​ (2)如果总的配额余额 < 0 并且 |总的配额余额绝对值| < 本次申请的配额, 说明本次申请的配额不够但是可以满足部分,更新本地配额为 总的配额余额 + 本次申请的配额

​ (3)如果总的配额余额<0 并且 |总的配额余额绝对值| >= 本次申请的配额, 说明本次申请的配额完全不能够满足,不更新本次配额,更新流控状态为配额不足被流控。

4、如果当前秒key对应的配额对象存在:先判断流控状态,如果状态为被流控直接返回流控。如果状态为未被流控,先看本地配额是否够扣,够扣的话获取本地配额锁然后扣减本地配额,扣完后释放本地配额锁;如果本地配额不够扣,从redis拉取配额,拉取的方法跟步骤3中的原子方法一致。

5、异常处理:如果从redis拉取配额的时候发生异常,则更新本地的流控状态为流控失效,不做后续流控处理,并记录失效时间点,流控判断状态是如果发现状态为流控失效并且当前时间与流控失效时间间隔没有超过30s直接继续执行,否则继续从redis拉取配额并做流控处理。

六、扩展

全局流控的思路其实可以拓展到实际业务应用中,例如支持百万或者千万级tps的秒杀抢购之类的,秒杀 或者抢购的对象数量就相当于流控接口的阈值。

后续会继续写篇文章介绍下分布式流控和实现思路,分布式流控的实现其实比起全局流控来说更加简单。

全局流控介绍和实现思路相关推荐

  1. 性能百万/s:腾讯轻量级全局流控方案详解

    作者:莫家文,腾讯事务型开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/320.html WeTest ...

  2. 性能百万/s:腾讯轻量级全局流控方案详解【转自Wetest】

    阿里用的方案是在nginx中配置限流(限流功能模块是自己开发的),流量统计线上是有监控打通的,具体的限流值是通过线上流量表现+线下性能测试(模拟线上场景)测试得出的. 全新的全局流控实现方案,既解决了 ...

  3. 分布式流控介绍和实现原理

    分布式流控 一.功能描述 控制单jvm内接口每秒钟的有效请求数 二.特点 1.粒度控制到接口 2.阈值为单jvm阈值 三.适用场景 1.保护单jvm服务请求 2.适用于交易链路商品维度的 3.适用于浏 ...

  4. 解锁新姿势 | 如何用配置中心实现全局动态流控?

    为什么80%的码农都做不了架构师?>>>    摘要: 当资源成为瓶颈时,服务框架需要对消费者做限流,启动流控保护机制.流量控制有多种策略,比较常用的有:针对访问速率的静态流控.针对 ...

  5. 阿里 双11 同款流控降级组件 Sentinel Go 正式 GA,助力云原生服务稳稳稳

    作者 | 赵奕豪(宿何)  Sentinel 开源项目负责人 来源|阿里巴巴云原生公众号 前言 微服务的稳定性一直是开发者非常关注的话题.随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间 ...

  6. 阿里 双11 同款流控降级组件 Sentinel Go 正式GA,云原生服务稳稳稳

    简介:微服务的稳定性一直是开发者非常关注的话题.随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战. 作者 | 赵奕豪(宿何)   ...

  7. 单机和分布式场景下,有哪些流控方案?

    简介:不同的场景下所需的流控算法不尽相同,那应该如何选择适用的流控方案呢?本文分享单机及分布式流控场景下,简单窗口.滑动窗口.漏桶.令牌桶.滑动日志等几种流控算法的思路和代码实现,并总结了各自的复杂度 ...

  8. 数据库降级_阿里 双11 同款流控降级组件 Sentinel Go 正式GA,云原生服务稳稳稳...

    简介:微服务的稳定性一直是开发者非常关注的话题.随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战. 作者 | 赵奕豪(宿何) S ...

  9. Sentinel(六)之集群流控

    转载自  集群流控 介绍 为什么要使用集群流控呢?假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50,但机器数可能很多(比如有 100 台).这时候我们很自然地就想到,找一个 serv ...

最新文章

  1. 解读丨从自动驾驶到学习机器学习:科技发展的15大趋势
  2. sqlite数据库的多线程访问问题
  3. 由于Eclipse版本不符造成的异常
  4. git切换到指定tag
  5. ABAP常用Function
  6. zigbee抗干扰matlab仿真,基于Zigbee的扩频通信MATLAB仿真.doc
  7. cbow word2vec 损失_Word2Vec的核心思想
  8. poj 1704 HDU-4315 阶梯博弈
  9. 42表盘直径是从哪测量_长度和时间的测量
  10. Android 通知栏用法例子
  11. java分子分母题,JAVA黄金分割点练习题
  12. 安装Oracle 11.2.0
  13. python解析json串与正则匹配对比
  14. 数据结构10——强连通
  15. OPENGL和DX的不同.
  16. PG Doc:17章1-3小节翻译
  17. python成品_京东抢购茅台Python打包版
  18. cocos2d - JS Sprite 镜像反转显示 ( Flipped )
  19. 小程序+二维码(带logo图片,可直接运行)
  20. 迭代学习控制方式Simulink建模与仿真

热门文章

  1. RTLviewer与TechnologyMapViewer的区别?
  2. ArcEngine10.1二次开发错误: 无法嵌入互操作类型,请改用适用的接口
  3. 【不积跬步,无以致千里】linux下如何查看自己的外网IP
  4. 在eclipse中配置server和database
  5. Ubuntu下挂载U盘
  6. Q96:PT(3.2):包裹的基于噪声的纹理(Wrapped Noise-Based Textures)
  7. Scala学习笔记总结
  8. 142. 环形链表 ||
  9. 三大运营商的物联网卡如何收费
  10. Django 模板中使用 Ajax POST