日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 统一流控服务开源:基于.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的流控服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。