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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高效的动态URL限流实现

發布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高效的动态URL限流实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????訪問限流對于一個網關來說是個比較重要的功能,它可以根據不同服務的處理能力來控制相關的訪問量,從而保障服務更可靠地運行。但是URL控制的路徑比較多還加上可動態添加刪除,大量的訪問匹配會很容易引起性能上的問題,接下來講解一下Beetlex的網關是如何實現,并得到一個更好的處理性能。

????????對于一個API服務來說它的接口非常多,當根據不同接口定義訪問控制的時候每次請求都會匹配一下URL然后進行訪問控制,當訪問量比較大的時候這個字符匹配損耗是非常大的;解決這種問題可以對URL策略對象進行一個緩存,但緩存有一個延時性的問題,畢竟策略可以隨意添加或刪除,這時候當前URL的處理策略是否有效就存在一些延時問題了。接下介紹一下Beetlex的網關設計是怎樣解決性能問題又能處理緩存的延時性問題。

??????? Beetlex在設計的時候引入了策略代理和版本問題,當網關接收到請求會拿到當前URL策略代理的緩存,然后再對比一下當前代理的版本和配置策略的版本是否一致,當一致的情況下直接用策略代理計數并判斷處理,否則重匹配策略生成代理寫入到緩存中。看上去有些復雜,實際代碼非常簡單

private void OnRefreshTable() {lock (this){var items = (from a in mLimitTable.Valuesorderby a.Url.Length descendingselect a).ToArray();if (items == null){items = new UrlLimitRecord[0];}mUrlTables = items;System.Threading.Interlocked.Increment(ref mVersion);} }public void AddUrl(string url, int maxrps) {mLimitTable[url] = new UrlLimitRecord { Url = url, MaxRPS = maxrps };OnRefreshTable(); }public void RemoveUrl(string url) {mLimitTable.TryRemove(url, out UrlLimitRecord result);OnRefreshTable(); }

在策略容器中添加一個版本號,當有修改的情況重新刷新匹配表和修改版本號。接下來在獲取策略的時候做一下判斷即可:

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; }

從緩存表中獲取代理,當獲取成功后判斷一下版本號,如果一致就返回否則重新匹配并更新到緩存中。

????????當看完以上代碼是不是感覺非常簡單,Beetlex網關的限流策略基本用這種方式進行設計和使用,以下是Beetlex網關的限流功能

if (!CheckIPTable(request, response))return; if (!CheckDomains(request)) {if (string.IsNullOrEmpty(Options.InvalidDomainUrl)){response.InnerError("509", "Invalid domain name!");}else{Move302Result result = new Move302Result(Options.InvalidDomainUrl);response.Result(result);}return; } HttpToken token = (HttpToken)request.Session.Tag; if (token.HttpRpsLimit.Check(this.Options.SessionMaxRps)) {response.InnerError("509", "session max rps limit!");return; } if (!mIPLimit.ValidateRPS(request)) {response.InnerError("509",?$"{request.RemoteIPAddress}?max rps limit!");return; } if (!CheckUrlLimit(request, response))return; if (!CheckDomainsLimit(request, response))return; if (RpsLimitHandlers.Count > 0)foreach (var handler in RpsLimitHandlers.Values){if (handler.Check(request, response)){response.InnerError("509", $"{handler.Name} max rps limit!");return;}}if (AllRpsLimit.Check(this.Options.MaxRps)) {response.InnerError("509", "server max rps limit!");return; }BeetleX

開源跨平臺通訊框架(支持TLS)
提供高性能服務和大數據處理解決方案

https://beetlex-io.com

總結

以上是生活随笔為你收集整理的高效的动态URL限流实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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