先前有一篇博文,梳理了流控服务的场景、业界做法和常用算法

统一流控服务开源-1:场景&业界做法&算法篇

最近完成了流控服务的开发,并在生产系统进行了大半年的验证,稳定可靠。今天整理一下核心设计和实现思路,开源到Github上,分享给大家

https://github.com/zhouguoqing/FlowControl

 一、令牌桶算法实现

先回顾一下令牌桶算法示意图

随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms) 往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),

如果桶已经满了就不再加了. 新请求来临时, 会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务.

令牌添加速度支持动态变化,实时控制处理的速率.

令牌桶有两个关键的属性:令牌桶容量(大小)和时间间隔,

有两个关键操作,从令牌桶中取Token;令牌桶定时的Reset重置。

  我们看TokenBucket类:

这个抽象类中,将UpdateToken作为抽象方法暴露出来,给实现类更多的灵活去控制令牌桶重置操作。基于此实现了“固定令牌桶”FixedTokenBucket

固定令牌桶在每次取Token时,都要执行方法ShouldThrottle。这个方法中:

并发取Token是线程安全的,这个地方用了Lock控制,损失了一部分性能。同时每次获取可用Token的时候,都会实时Check一下是否需要到达Reset令牌桶的时间。

获取到可用令牌后,令牌桶中令牌的数量-1。如果没有足够的可用令牌,则返回等待到下次Reset令牌桶的时间。如下代码:

以上就是令牌桶算法的实现。我们继续看漏桶算法。

 二、漏桶算法实现

首先回顾一下漏桶算法的原理:

水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),

当水流入速度过大会直接溢出(访问频率超过接口响应速率), 然后就拒绝请求,

可以看出漏桶算法能强行限制数据的传输速率.

有两个变量:

  • 一个是桶的大小,支持流量突发增多时可以存多少的水(burst),

  • 另一个是水桶漏洞的大小(rate)。

漏桶抽象类:LeakTokenBucket,继承与令牌桶抽象父类 TokenBucket,说明了获取令牌(漏出令牌)在底层的方式是一致的,不一样的是重置令牌的方式(务必理解这一点)

可以看出,漏桶是在令牌桶的基础上增加了二个重要的属性:这两个属性决定了重置令牌桶的方式

stepTokens:每间隔时间内漏的数量

ticksStepInterval:漏的间隔时间

举个例子:TPS 100,即每秒漏出100个Token,stepTokens =100, ticksStepInterval=1000ms

漏桶的具体实现有两种:空桶和满桶

StepDownTokenBucket 满桶:即一把将令牌桶填充满

StepUpLeakyTokenBucket 空桶:即每次只将stepTokens个数的令牌放到桶中

三、流控服务封装

第二章节,详细介绍了令牌桶和漏桶的具体实现。基于以上,要重点介绍接口:IThrottleStrategy:流控的具体方式

有了这个流控方式接口后,我们还需要一个流控策略定义类:FlowControlStrategy

即定义具体的流控策略:以下是这个类的详细属性和成员:  不仅定义了流控策略类型,还定义了流控的维度信息和流控阈值,这样流控就做成依赖注入的方式了!

同时,流控策略类型,我们抽象了一个枚举:FlowControlStrategyType

支持3种流控策略:TPS、Sum(指定时间段内请求的次数),Delay延迟

面向每种流控策略类型,提供了一个对应的流控器,比如说TPS的流控器

Sum(指定时间段内请求的次数)流控器:

同时,通过一个创建者工厂,根据不同的流控策略,创建对应的流控器(做了一层缓存,性能更好):

有了流控策略定义、我们更进一步,继续封装了流控Facede服务,这样把流控的变化封装到内部。对外只提供流控服务接口,流控时动态传入流控策略和流控个数:FlowControlService

以上,统一流控服务完成了第一个版本的封装。接下来我们看示例代码

 四、示例代码

是不是很简单。

大家如果希望了解详细的代码,请参考这个项目的GitHub地址:

https://github.com/zhouguoqing/FlowControl

同时也欢迎大家一起改进完善。

统一流控服务开源:基于.Net Core的流控服务相关推荐

  1. .NET Core微服务之基于IdentityServer建立授权与验证服务(续)

    上一篇<.NET Core微服务之基于IdentityServer建立授权与验证服务>我们基于IdentityServer4建立了一个AuthorizationServer,并且继承了Qu ...

  2. [零基础,全开源]基于web的远程深度学习服务搭建

    所有代码和工具均已开源.关注"DL工程实践",后台回复"web",自动获取. 1.背景介绍 目前有很多的深度学习推理方案,不过大多是离线部署的.这方面可以利用的 ...

  3. 微软开源基于.NET Core的量子开发工具包 QDK

    微软最近开源了量子开发工具包(Quantum Development Kit,QDK),旨在使"量子计算和算法开发对开发人员来说更容易.更透明".微软 QDK 包括 Q#编译器.量 ...

  4. .NET Core微服务之基于IdentityServer建立授权与验证服务

    一.IdentityServer的预备知识 要学习IdentityServer,事先得了解一下基于Token的验证体系,这是一个庞大的主题,涉及到Token,OAuth&OpenID,JWT, ...

  5. python交通流预测算法_基于机器学习的交通流预测技术的研究与应用

    摘要: 随着城市化进程的加快,交通系统的智能化迫在眉睫.作为智能交通系统的重要组成部分,短时交通流预测也得到了迅速的发展,而如何提升短时交通流预测的精度,保障智能交通系统的高效运行,一直是学者们研究的 ...

  6. 计算机温度测控技术程序,基于单片机的温度测控系统

    摘要:本次设计的温度测控系统采用MCS-51系列单片机中的STC89C58作为微处理器,使用集成温度传感器AD-590采集温度信息,光电耦合双向晶闸管为驱动电路,可精确地采集环境温度信息,稳定性高,抗 ...

  7. 微服务应用-基于Spring Cloud和Reactor构建网上商店微服务(下)

    前言 上篇主要是讲解理论知识和项目架构要点,这篇将集中在微服务中使用spring Boot.Spring Cloud和Project Reactor实现事件溯源的原始主题.文章中也会介绍项目实现一些技 ...

  8. 基于微信企业号的校园服务器,基于微信企业号的校园移动服务.doc

    基于微信企业号的校园移动服务.doc 基于微信企业号的校园移动服务 摘 要 以微信为代表的即时通信软件,打破了时间.空间的限制,集社交.传播和教育等功能为一体,在信息技术的推动下成为新型的教育方式并被 ...

  9. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中谈谈surging Api 网关 开源地址:https://gith ...

最新文章

  1. [转]html5: postMessage解决跨域和跨页面通信的问题
  2. LeetCode Integer to Roman(数字转罗马)
  3. 前端一HTML:十三:css的三大特性
  4. [C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现
  5. vue 开发过程中遇到的问题
  6. 普通路由器改4g路由器_4G工业路由器助力叉车锂电池监测
  7. 帝国理工:如何用 AI 解决 80% 专科医生担忧的心律装置移植手术难题
  8. 2017 年十大网页设计趋势
  9. 图像读取、显示和保存
  10. java jre下载安装教程_java JRE下载、安装以及环境变量教程
  11. 决定明智地放弃对名手旋风等象棋引擎的破解...
  12. git 小乌龟代码回退
  13. 【夜深人静写代码】倍增算法学习记录
  14. js数组方法及返回值
  15. 【最优化算法】基于【MATLAB】的最速下降仿真
  16. sentinel流量卫兵组件学习
  17. CAP 和 Zookeeper
  18. 华为nova10和华为nova9哪个值得买 两者配置对比
  19. 【经典题】跟着凡人玩转C语言之快速排序算法
  20. 求给定非负整数的阶乘

热门文章

  1. C# 读写ACCESS的OLE对象,演示图片与长文件的读写
  2. merge r语言daframe_R语言总结
  3. 基于 HTML5 Canvas 绘制的电信网络拓扑图
  4. 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放
  5. 玩转 Linux 之:磁盘分区、挂载知多少?
  6. command not found Operation not permitted
  7. openssh登陆时提示服务器拒绝了密码
  8. python 抓取的网页默认是bytes的,要转码
  9. 如何在已安装TMG2010服务器上安装Symantec Backup Exec 2010 Remote Agent
  10. c++ memcpy与strcpy的比较