高效的动态URL限流实现
????????訪問限流對(duì)于一個(gè)網(wǎng)關(guān)來說是個(gè)比較重要的功能,它可以根據(jù)不同服務(wù)的處理能力來控制相關(guān)的訪問量,從而保障服務(wù)更可靠地運(yùn)行。但是URL控制的路徑比較多還加上可動(dòng)態(tài)添加刪除,大量的訪問匹配會(huì)很容易引起性能上的問題,接下來講解一下Beetlex的網(wǎng)關(guān)是如何實(shí)現(xiàn),并得到一個(gè)更好的處理性能。
????????對(duì)于一個(gè)API服務(wù)來說它的接口非常多,當(dāng)根據(jù)不同接口定義訪問控制的時(shí)候每次請求都會(huì)匹配一下URL然后進(jìn)行訪問控制,當(dāng)訪問量比較大的時(shí)候這個(gè)字符匹配損耗是非常大的;解決這種問題可以對(duì)URL策略對(duì)象進(jìn)行一個(gè)緩存,但緩存有一個(gè)延時(shí)性的問題,畢竟策略可以隨意添加或刪除,這時(shí)候當(dāng)前URL的處理策略是否有效就存在一些延時(shí)問題了。接下介紹一下Beetlex的網(wǎng)關(guān)設(shè)計(jì)是怎樣解決性能問題又能處理緩存的延時(shí)性問題。
??????? Beetlex在設(shè)計(jì)的時(shí)候引入了策略代理和版本問題,當(dāng)網(wǎng)關(guān)接收到請求會(huì)拿到當(dāng)前URL策略代理的緩存,然后再對(duì)比一下當(dāng)前代理的版本和配置策略的版本是否一致,當(dāng)一致的情況下直接用策略代理計(jì)數(shù)并判斷處理,否則重匹配策略生成代理寫入到緩存中。看上去有些復(fù)雜,實(shí)際代碼非常簡單
在策略容器中添加一個(gè)版本號(hào),當(dāng)有修改的情況重新刷新匹配表和修改版本號(hào)。接下來在獲取策略的時(shí)候做一下判斷即可:
internal UrlLimitAgent Match(string url) {if (mCachedLimitTable.TryGetValue(url, out UrlLimitAgent result)){if (result.Version == Version)return result;}var items = mUrlTables;result = new UrlLimitAgent();foreach (var item in items){if (url.IndexOf(item.Url, StringComparison.CurrentCultureIgnoreCase) >= 0){result.RpsLimit = new RpsLimit(item.MaxRPS);result.Config = item;}}result.Version = System.Threading.Interlocked.Add(ref mVersion, 0);mCachedLimitTable[url] = result;return result; }從緩存表中獲取代理,當(dāng)獲取成功后判斷一下版本號(hào),如果一致就返回否則重新匹配并更新到緩存中。
????????當(dāng)看完以上代碼是不是感覺非常簡單,Beetlex網(wǎng)關(guān)的限流策略基本用這種方式進(jìn)行設(shè)計(jì)和使用,以下是Beetlex網(wǎng)關(guān)的限流功能
開源跨平臺(tái)通訊框架(支持TLS)
提供高性能服務(wù)和大數(shù)據(jù)處理解決方案
https://beetlex-io.com
總結(jié)
以上是生活随笔為你收集整理的高效的动态URL限流实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [探索 .NET 6]01 揭开 Con
- 下一篇: 黄老师离开呆了十年的上海