摘要:如果一直優(yōu)先處理高優(yōu)先級的隊列,等這個隊列的請求處理完了,再處理優(yōu)先級低一級的請求,那么優(yōu)先級低的隊列可能要等很久才能處理。參考彈力設(shè)計之限流設(shè)計陳皓
調(diào)用配額
之前一篇文章到通過access key調(diào)用API的方式,這種調(diào)用方式難免會碰到一個問題,那就是,如果用戶不挺地高頻率調(diào)用API,服務器是否會過載,如果過載了,是否會影響內(nèi)部服務。
有個做法,就是給access key設(shè)置調(diào)用配額(limit,duration),這個配額指的是在某個時間段內(nèi)(duration),調(diào)用的次數(shù)不能超過limit指定的數(shù)額。如果超過了,則拒絕服務。這種可以通過緩存來實現(xiàn),利用緩存的expire時間,并且維持一個計數(shù)器,每當調(diào)用一次,則計數(shù)器減一。
def init(access_key, limit, duration): memcache.set(key=access_key, val=limit, expire=duration) def handle(access_key): count = memcache.get(key=access_key) if count == 0: return "DENY" memcache.decr(key=access_key) return "OK"
前面init函數(shù)做初始化,后面handle函數(shù)對請求做判斷,每掉用一次,就把計數(shù)器減一;如果當前計數(shù)器里的值為0,則拒絕服務。
使用配額的目的是:對于一些高級客戶,可以提高配額,以提高體驗。如果是內(nèi)部服務調(diào)用,那么這個配額,可以提高些。
請求隊列可以提供不同優(yōu)先級的隊列,針對不同的請求的優(yōu)先級,把他們放到不同的隊列里,先處理優(yōu)先級高的隊列,然后優(yōu)先級更低的隊列。(可以用redis里的有序隊列來實現(xiàn)?)如果有針對這個隊列的處理服務,這個服務能夠合并請求,那么則可以減輕后端服務的負載。
student: { "name": "ABC", "age": 30, } requests: [0] {"action": "ModifyItems", "name": "xiao ming"} [1] {"action": "ModifyItems", "age": 26} After handled new request: [0] {"action": "ModifyItems", "age": 26, "name": "xiao ming"}
如上,如果數(shù)據(jù)庫里有一個對象student,通過請求ModifyItems可以修改student屬性,請求隊列如requests所示,第一個請求修改了name,第二個請求修改了age,這個時候,可以把這2個請求合并成一個,這個新的請求跟兩個請求最終達到的小姑都是一樣的,所以是可行的。
如果一直優(yōu)先處理高優(yōu)先級的隊列,等這個隊列的請求處理完了,再處理優(yōu)先級低一級的請求,那么優(yōu)先級低的隊列可能要等很久才能處理。
這個時候,可以根據(jù)權(quán)重來處理,如果優(yōu)先級隊列有2個,他們優(yōu)先級分別是:2和1,數(shù)值越高,表示優(yōu)先級更高,那么根據(jù)優(yōu)先級權(quán)重,服務器先處理優(yōu)先級高的隊列里的2個請求,然后再去處理優(yōu)先級低隊列里的1個請求,優(yōu)先級低的隊列則不會被餓死。
參考:《彈力設(shè)計之“限流設(shè)計”》陳皓
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/61995.html
摘要:實現(xiàn)熔斷降級注解除了可以用來做限流控制之外,還能實現(xiàn)與類似的熔斷降級策略。函數(shù)簽名要求返回值類型必須與原函數(shù)返回值類型一致方法參數(shù)列表需要為空,或者可以額外多一個類型的參數(shù)用于接收對應的異常。若未配置和,則被限流降級時會將直接拋出。 在之前的《使用Sentinel實現(xiàn)接口限流》一文中,我們僅依靠引入Spring Cloud Alibaba對Sentinel的整合封裝spring-clo...
摘要:限流算法最簡單粗暴的限流算法就是計數(shù)器法了,而比較常用的有漏桶算法和令牌桶算法計數(shù)器計數(shù)器法是限流算法里最簡單也是最容易實現(xiàn)的一種算法。 運營研發(fā)團隊 李樂 高并發(fā)系統(tǒng)有三把利器:緩存、降級和限流; 限流的目的是通過對并發(fā)訪問/請求進行限速來保護系統(tǒng),一旦達到限制速率則可以拒絕服務(定向到錯誤頁)、排隊等待(秒殺)、降級(返回兜底數(shù)據(jù)或默認數(shù)據(jù)); 高并發(fā)系統(tǒng)常見的限流有:限制總并發(fā)...
摘要:下面是幾種常見的限流技術(shù)一限流算法常用的限流算法有令牌桶,漏桶令牌桶令牌桶算法是網(wǎng)絡流量整形和速率限制中最常使用的一種算法。 就秒殺接口來說,當訪問頻率或者并發(fā)請求超過其承受范圍的時候,這時候我們就要考慮限流來保證接口的可用性,以防止非預期的請求對系統(tǒng)壓力過大而引起的系統(tǒng)癱瘓。通常的策略就是拒絕多余的訪問,或者讓多余的訪問排隊等待服務。下面是幾種常見的限流技術(shù) 一、限流算法常用的限流算...
摘要:之前有了解到哥的一部分讀者們沒有充分搞清楚限流和熔斷的關(guān)系。后者表示系統(tǒng)在同一時刻能處理的最大請求數(shù)量,比如次的并發(fā)。后續(xù)限流策略需要設(shè)定的具體標準數(shù)值就是從這些指標中來的。限流閾值不繼續(xù)處理請求。 如果這是第二次看到我的文章,歡迎掃描文末二維碼訂閱我喲~本文長度為2869字,建議閱讀8分鐘。 可能你在網(wǎng)上看過不少「限流」相關(guān)的文章,但是z哥的這篇可能是最全面,最深入淺出的一篇了(容我...
摘要:計數(shù)限流算法無論固定窗口還是滑動窗口核心均是對請求進行計數(shù),區(qū)別僅僅在于對于計數(shù)時間區(qū)間的處理。令牌桶限流實現(xiàn)原理令牌桶限流的實現(xiàn)原理在有詳細說明。因此由此為入口進行分析。目前可返回的實現(xiàn)子類包括及兩種,具體不同下文詳細分析。 限流 限流一詞常用于計算機網(wǎng)絡之中,定義如下: In computer networks, rate limiting is used to control t...
閱讀 3051·2021-09-22 15:52
閱讀 2918·2019-08-30 15:55
閱讀 2713·2019-08-30 15:53
閱讀 2464·2019-08-30 13:21
閱讀 1634·2019-08-30 13:10
閱讀 2492·2019-08-26 12:09
閱讀 2579·2019-08-26 10:33
閱讀 1811·2019-08-23 18:06