统一流控服务开源:基于.Net Core的流控服务
先前有一篇博文,梳理了流控服務(wù)的場景、業(yè)界做法和常用算法
統(tǒng)一流控服務(wù)開源-1:場景&業(yè)界做法&算法篇
最近完成了流控服務(wù)的開發(fā),并在生產(chǎn)系統(tǒng)進(jìn)行了大半年的驗(yàn)證,穩(wěn)定可靠。今天整理一下核心設(shè)計(jì)和實(shí)現(xiàn)思路,開源到Github上,分享給大家
? ? ?https://github.com/zhouguoqing/FlowControl
?一、令牌桶算法實(shí)現(xiàn)
? 先回顧一下令牌桶算法示意圖
??
? 隨著時(shí)間流逝,系統(tǒng)會(huì)按恒定1/QPS時(shí)間間隔(如果QPS=100,則間隔是10ms)?往桶里加入Token(想象和漏洞漏水相反,有個(gè)水龍頭在不斷的加水),
? 如果桶已經(jīng)滿了就不再加了. 新請(qǐng)求來臨時(shí),?會(huì)各自拿走一個(gè)Token,如果沒有Token可拿了就阻塞或者拒絕服務(wù).
? 令牌添加速度支持動(dòng)態(tài)變化,實(shí)時(shí)控制處理的速率.
? 令牌桶有兩個(gè)關(guān)鍵的屬性:令牌桶容量(大小)和時(shí)間間隔,
? 有兩個(gè)關(guān)鍵操作,從令牌桶中取Token;令牌桶定時(shí)的Reset重置。
? 我們看TokenBucket類:
?這個(gè)抽象類中,將UpdateToken作為抽象方法暴露出來,給實(shí)現(xiàn)類更多的靈活去控制令牌桶重置操作。基于此實(shí)現(xiàn)了“固定令牌桶”FixedTokenBucket
? ?固定令牌桶在每次取Token時(shí),都要執(zhí)行方法ShouldThrottle。這個(gè)方法中:
? ?并發(fā)取Token是線程安全的,這個(gè)地方用了Lock控制,損失了一部分性能。同時(shí)每次獲取可用Token的時(shí)候,都會(huì)實(shí)時(shí)Check一下是否需要到達(dá)Reset令牌桶的時(shí)間。
? ?獲取到可用令牌后,令牌桶中令牌的數(shù)量-1。如果沒有足夠的可用令牌,則返回等待到下次Reset令牌桶的時(shí)間。如下代碼:
? ?以上就是令牌桶算法的實(shí)現(xiàn)。我們繼續(xù)看漏桶算法。
?二、漏桶算法實(shí)現(xiàn)
? 首先回顧一下漏桶算法的原理:
??‘
? 水(請(qǐng)求)先進(jìn)入到漏桶里,漏桶以一定的速度出水(接口有響應(yīng)速率),
? 當(dāng)水流入速度過大會(huì)直接溢出(訪問頻率超過接口響應(yīng)速率), 然后就拒絕請(qǐng)求,
? 可以看出漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率.
? 有兩個(gè)變量:
一個(gè)是桶的大小,支持流量突發(fā)增多時(shí)可以存多少的水(burst),
另一個(gè)是水桶漏洞的大小(rate)。
? ?漏桶抽象類:LeakTokenBucket,繼承與令牌桶抽象父類 TokenBucket,說明了獲取令牌(漏出令牌)在底層的方式是一致的,不一樣的是重置令牌的方式(務(wù)必理解這一點(diǎn))
? ? 可以看出,漏桶是在令牌桶的基礎(chǔ)上增加了二個(gè)重要的屬性:這兩個(gè)屬性決定了重置令牌桶的方式
? ? stepTokens:每間隔時(shí)間內(nèi)漏的數(shù)量
? ? ticksStepInterval:漏的間隔時(shí)間
? ? 舉個(gè)例子:TPS 100,即每秒漏出100個(gè)Token,stepTokens =100, ticksStepInterval=1000ms
? ? 漏桶的具體實(shí)現(xiàn)有兩種:空桶和滿桶
? ? StepDownTokenBucket 滿桶:即一把將令牌桶填充滿
? ?StepUpLeakyTokenBucket 空桶:即每次只將stepTokens個(gè)數(shù)的令牌放到桶中? ?
?三、流控服務(wù)封裝
? 第二章節(jié),詳細(xì)介紹了令牌桶和漏桶的具體實(shí)現(xiàn)。基于以上,要重點(diǎn)介紹接口:IThrottleStrategy:流控的具體方式
? ? 有了這個(gè)流控方式接口后,我們還需要一個(gè)流控策略定義類:FlowControlStrategy
? ? 即定義具體的流控策略:以下是這個(gè)類的詳細(xì)屬性和成員:? 不僅定義了流控策略類型,還定義了流控的維度信息和流控閾值,這樣流控就做成依賴注入的方式了!?
? ?同時(shí),流控策略類型,我們抽象了一個(gè)枚舉:FlowControlStrategyType
? ?支持3種流控策略:TPS、Sum(指定時(shí)間段內(nèi)請(qǐng)求的次數(shù)),Delay延遲
? 面向每種流控策略類型,提供了一個(gè)對(duì)應(yīng)的流控器,比如說TPS的流控器
? Sum(指定時(shí)間段內(nèi)請(qǐng)求的次數(shù))流控器:
? 同時(shí),通過一個(gè)創(chuàng)建者工廠,根據(jù)不同的流控策略,創(chuàng)建對(duì)應(yīng)的流控器(做了一層緩存,性能更好):
? ?有了流控策略定義、我們更進(jìn)一步,繼續(xù)封裝了流控Facede服務(wù),這樣把流控的變化封裝到內(nèi)部。對(duì)外只提供流控服務(wù)接口,流控時(shí)動(dòng)態(tài)傳入流控策略和流控個(gè)數(shù):FlowControlService
? 以上,統(tǒng)一流控服務(wù)完成了第一個(gè)版本的封裝。接下來我們看示例代碼
?四、示例代碼
? ??
? ?
? ? 是不是很簡單。
? ? 大家如果希望了解詳細(xì)的代碼,請(qǐng)參考這個(gè)項(xiàng)目的GitHub地址:
? ??https://github.com/zhouguoqing/FlowControl
? ? 同時(shí)也歡迎大家一起改進(jìn)完善。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的统一流控服务开源:基于.Net Core的流控服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你不得不了解的10款服务器监控工具
- 下一篇: .NET Core 编写 Azure F