统一流控服务开源:基于.Net Core的流控服务
先前有一篇博文,梳理了流控服務的場景、業界做法和常用算法
統一流控服務開源-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的流控服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你不得不了解的10款服务器监控工具
- 下一篇: asp.net ajax控件工具集 Au