如何將介面進行限流

2022-07-23 14:06:22 字數 1011 閱讀 1043

採用計數器實現限流有點簡單粗暴,一般我們會限 制一秒鐘的能夠通過的請求數,比如限流qps為100,演算法的實現思路就是從第乙個請求進來開始計時,在接下去的1s內,每來乙個請求,就把計數加1,如果累加的數字達到了100,那麼後續的請求就會被全部拒絕。等到1s結束後,把計數恢復成0,重新開始計數。

具體的實現可以是這樣的:對於每次服務呼叫,可以通過 atomiclong#incrementandget()方法來給計數器加1並返回最新值,通過這個最新值和閾值進行比較。

為了消除"突刺現象",可以採用漏桶演算法實現限流,漏桶演算法這個名字就很形象,演算法內部有乙個容器,類似生活用到的漏斗,當請求進來時,相當於水倒入漏斗,然後從下端小口慢慢勻速的流出。不管上面流量多大,下面流出的速度始終保持不變。

不管服務呼叫方多麼不穩定,通過漏桶演算法進行限流,每10毫秒處理一次請求。因為處理的速度是固定的,請求進來的速度是未知的,可能突然進來很多請求,沒來得及處理的請求就先放在桶裡,既然是個桶,肯定是有容量上限,如果桶滿了,那麼新進來的請求就丟棄。

在演算法實現方面,可以準備乙個佇列,用來儲存請求,另外通過乙個執行緒池定期從佇列中獲取請求並執行,可以一次性獲取多個併發執行。

這種演算法,在使用過後也存在弊端:無法應對短時間的突發流量。

從某種意義上講,令牌桶演算法是對漏桶演算法的一種改進,桶演算法能夠限 制請求呼叫的速率,而令牌桶演算法能夠在限 制呼叫的平均速率的同時還允許一定程度的突發呼叫。

在令牌桶演算法中,存在乙個桶,用來存放固定數量的令牌。演算法中存在一種機制,以一定的速率往桶中放令牌。每次請求呼叫需要先獲取令牌,只有拿到令牌,才有機會繼續執行,否則選擇選擇等待可用的令牌、或者直接拒絕。

放令牌這個動作是持續不斷的進行,如果桶中令牌數達到上限,就丟棄令牌,所以就存在這種情況,桶中一直有大量的可用令牌,這時進來的請求就可以直接拿到令牌執行,比如設定qps為100,那麼限流器初始化完成一秒後,桶中就已經有100個令牌了,這時服務還沒完全啟動好,等啟動完成對外提供服務時,該限流器可以抵擋瞬時的100個請求。所以,只有桶中沒有令牌時,請求才會進行等待,最後相當於以一定的速率執行。

如何將查詢結果進行排名

於是乎我就開始寫,嘿,奇怪,我還真沒有寫過,於是找了寫資料,借鑑了一下別人的,結果如下 create procedure csp getoperatorscorebydate begindate datetime,enddate datetime ascreate table temp 定義臨時表,...

基於threejs如何將兩個模型進行對比?

模型對比是從構件級來比較模型不同版本之間的差異。模型對比功能可以對比兩個不同版本模型之間的差異,這些差異包含構件關係的差異 構件資訊的差異以及模型中構件的增加與刪除等改動。構件資訊的差異是指匹配構件的屬性資訊 基本資訊 幾何資訊的差異 構件關係的差異是指構件父子節點關係的變化,管道系統中連線關係的變...

如何將表單居中顯示 如何將重複資料突出顯示?

將 中一列資料中重複的,使用特殊顏色突出顯示或者使用一些符號標記出來。例如 乙個 商,可以邀請別的 商加入成為聯合體,報表要顯示所有 商,然後 商最後一列顯示所有聯合體,當聯合體 商跟別的 商重複時要突出顯示,並且加星號。用設計器自帶 demo 資料來源中的訂單明細資料表,使用嚮導建立一張分組報表,...