统一流控服务开源:基于.Net Core的流控服务

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

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

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

640?wx_fmt=png

     https://github.com/zhouguoqing/FlowControl

640?wx_fmt=png

 一、令牌桶算法实现

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

  640?wx_fmt=png

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

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

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

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

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

  我们看TokenBucket类:

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

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

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

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

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

 二、漏桶算法实现

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

  640?wx_fmt=png

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

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

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

  有两个变量:

  • 一个是桶的大小,支持流量突发增多时可以存多少的水(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

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

 四、示例代码

    640?wx_fmt=png

   640?wx_fmt=png

    是不是很简单。

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

    https://github.com/zhouguoqing/FlowControl

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 编写 Azure Function 并连接 GitHub 持续部署

点击上方蓝字关注“汪宇杰博客”导语Azure Function 是一个事件驱动型无服务器计算平台,可以解决复杂的业务流程问题,更加高效地进行开发。在本地构建和调试,而无需额外的设置,在云中大规模部署和操作,并使用触发器和绑…

「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...

在前面一文中,正式引出了SSIS专业数据ETL工具,笔者仅能作引路作用,未能使用文章的方式给大家写出更多的入门级的文章,希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习。同时也想给大家分享到SSIS的能力边界性&…

数据结构为什么那么难?

来源 | 异步 | 文末赠书2017年8月,本着让更多的人轻松学习算法的初心,我写作了第一本书《趣学算法》,该书在出版后受到广大读者一致好评,在一年内重印了10次,并输出了繁体版的版权。一位读者对我说,读这本书…

书籍推荐:《C#7.0本质论》

在dotNet平台中有多种开发语言可以使用,C#无疑是其中应用得最为广泛的。学习一门编程语言最好的方式就是找一本好书系统地学习,我读过的关于C#的书籍中,我认为下面三本最为经典:《C#本质论》:入门类,目前最…

gRPC的简单使用

前言八月初的时候,在公司内部做了一个主题为《gRPC的简单使用》的分享,其实就是和小伙伴们扯扯淡,现在抽空回忆一下,也算是一个小小的总结吧。现在市面上耳熟能详的RPC框架也很多,下面列举几个遇到比较多的。谷歌的gRP…

生命周期结束,Spring Boot 1.x退役

一年前 Spring 官方宣布 Spring Boot 1.x 生命周期将于今年 8 月 1 日结束,如今时间已到,在发布 Spring Boot 1.5.22 的同时,Spring 确认将不再为 1.x 系列发布维护版本。官方希望用户尽快迁移到 Spring Boot 2.x 上,为此还制作了…

Apollo 配置中心:分布式部署

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端…

使用Redis实现最近N条数据的决策

前言很多时候,我们会根据用户最近一段时间的行为,做出一些相应的策略,从而改变系统的运动轨迹。举个简单的例子来说明一下:假设A公司现在有两个合作伙伴(B和C),B和C都是提供天气数据的,现在A公司做了一个聚…

为什么我不喜欢数据库三范式

插曲最近,一个远房亲戚的小表弟准备选修专业找到我问:"哥,现在学数据库有没有前途阿?""当然有啊,前途大大的呢""那我现在开始学数据库,需要先从什么开始呢?""学课程的话&#xf…

硬货 - 技术人也能轻松玩转公众号?正确姿势竟然是...

最近在知乎上看到关于「公众号是否有“前”途」的相关问题... 问题下面有些精华回答~微信公众号还有“前”途吗? - 知乎https://www.zhihu.com/question/324575670很好的问题!作为一个技术人,我决定将此问题和自身情况结合起来,于…

你必须知道的Dockerfile

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。本文预计阅读时间为5分钟。01—关于Dockerfile在Docker中创建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个Docker镜像的描述文件,我…

RabbitMQ 死信/死信队列

一、RabbitMQ 死信/死信队列1、DLXDead Letter Exchange 的缩写DLX(Dead Letter Exchanges)死信交换,死信队列本身也是一个普通的消息队列,在创建队列的时候,通过设置一些关键参数,可以将一个普通的消息队列…

centos7 rabbitmq安装/配置

一、RabbitMQ简单介绍RabbitMQ就是当前最主流的消息中间件之一。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支…

Hyper-V + CentOS7 安装视频教程

一、前言本文使用图文视频的方式展示安装Centos7,【喜欢看视频学习的童靴请拖至文尾观看视频】二、虚拟机配置指定虚拟机名称&安装位置选择虚拟机代数 第一代虚拟机(例如Server 2008等平台技术,支持Vista、Win7) 第二代虚拟机…

程序员修神之路--用NOSql给高并发系统加速

领取福利记得长按,领取技术书籍哦随着互联网大潮的到来,越来越多网站,应用系统需要海量数据的支撑,高并发、低延迟、高可用、高扩展等要求在传统的关系型数据库中已经得不到满足,或者说关系型数据库应对这些需求已经显…

限时团购,6.5折:《C# 7.0 核心技术指南》

大家好,经过近两年的翻译,《C# 7.0 核心技术指南》终于和大家见面了。全书由 ThoughtWorks 高级咨询师,资深 .NET 专家刘夏翻译。作为一本第七次再版的图书,此次翻译对书中的字句进行了重新整理。期间和图书的原作者 Joe Albahari…

Azure 命令行工具大混战,都是什么,该选哪个?

点击上方蓝字关注“汪宇杰博客”导语最近在学习 Azure 的命令行玩法,发现官方有不止一种命令行工具,容易对新手产生混淆,本文将介绍各种工具都是干啥的,以及如何选择。目前,微软官方有3个Azure命令行工具,分…

揭秘鸿蒙生态背后的DevOps实践

(图片来源于网络)8月9日,华为发布了鸿蒙操作系统,在发布会上我们看到了鸿蒙系统的研发历程:2017年,鸿蒙内核1.0完成技术验证;2018年,鸿蒙内核2.0用于终端TEE;2019年&…

AT3557 Four Coloring 切比雪夫距离 + 四色构造

传送门 由于曼哈顿距离在图上显示的是一个棱形,并不是很好看,所以我们将其旋转454545,转换成切比雪夫距离,这样就变成了一个正方形,正方形内部的点距离都不超过ddd,此时可以将正方形内部的点看成一个整体&a…

SonarQube系列一、Linux安装与部署

来源:https://www.cnblogs.com/7tiny/p/11269774.html【前言】随着项目团队规模日益壮大,项目代码量也越来越多。且不说团队成员编码水平层次不齐,即便是老手,也难免因为代码量的增加和任务的繁重而忽略代码的质量,最终…