【廣告】
分析之前
依我個人的理解來說限流的話應該靈活到可以針對每一個接口來做。比如說一個類里面有5個接口,那么我的限流插件就應該能針對每一個接口就行不同的限流方案。在這個特定的項目中,這個團隊的開發(fā)人員以前都沒有NoSQL經(jīng)驗,但是有大量的SQLServer經(jīng)驗。所以呢,既然針對的每個接口所以就需要一個可以標示這個接口的key(我取的是類名 方法名 入?yún)ⅲ?
分布式限流強烈推薦使用redis lua或者nginx lua來實現(xiàn)。
這里用2個限流條件來做示例講一下常見的限流算法:
接口1它10秒鐘很大允許訪問100次
接口2它10秒鐘很大允許每個人訪問100次。
計數(shù)器算法
這個算法可以說是限流算法中簡單的一種算法了。
核心思想
計數(shù)器算法的意思呢就是當接口在一個時間單位中被訪問時,我就記下來訪問次數(shù),直到它訪問的次數(shù)到達上限。
涉及變量
接口(key)
時間單位(expire)
允許訪問多少次(limit)
訪問次數(shù)(value)
條件一
當一個請求過來時,我們就會得到這個key。
123456789 if(存在key){ value ; if(value>=limit){ 不能訪問 } }else{ 添加key,value為1 設置key過期時間為expire }
快進5個月……
該系統(tǒng)開始經(jīng)歷許多關于維護CRUD操作完整性的問題。設計用來處理事務的瘦應用程序邏輯層已經(jīng)不再那么薄了。升級和向后兼容性的故事開始變得更加復雜。
由于受到許多其他問題的困擾,工程師們又回到了繪圖板——這次是用Azure SQL替換存儲層!我不記得具體的細節(jié),但是這個改變增加了大約40%的額外時間和成本。
管理層很不高興,這個項目幾乎掉了。但是團隊的工程師們非常好,他們能夠完成這個項目,盡管有了一些延遲和初的錯誤的技術決定。
這個項目有一個圓滿的結局——但它也可能不是這樣的。事實上,很多內(nèi)部項目都被關閉了,因為他們不能在承諾的日期范圍內(nèi)交付承諾的功能。
那么,您如何知道NoSQL解決方案適合您的下一個軟件項目呢?首先問問你自己和你的團隊這十個問題:
一般來說,在系統(tǒng)的設計范圍之內(nèi),吞吐量隨系統(tǒng)的并發(fā)用戶數(shù)的增加呈現(xiàn)增加趨勢,也就是說你客戶端來多少請求數(shù)系統(tǒng)吃(處理)多少請求數(shù);當超出這個范圍時有兩種情況,一種是系統(tǒng)只能處理這么多,超過這個數(shù)系統(tǒng)不接收了,后隨著并發(fā)用戶數(shù)的增多吞吐量是一個水平的直線;二、正厚軟件業(yè)務范圍:軟件測試:專業(yè)技能提升、專業(yè)咨詢服務、專業(yè)企業(yè)內(nèi)訓、軟件測試外包、測試人才外包等。
還有一種情況是不管來多少系統(tǒng)都接收后導致系統(tǒng)吞吐量下降甚至系統(tǒng)崩潰。并發(fā)用戶數(shù)是客戶端單位時間內(nèi)對服務器端施加的壓力,具體能不能接受并處理要看被測系統(tǒng)的吞吐量,而吞吐量是被測系統(tǒng)單位時間內(nèi)處理的請求數(shù)或者說單位時間內(nèi)處理的字節(jié)數(shù);組織你的思路既然你的大量時間都是用在溝通、研究和多任務上,你需要一些工具來幫助一切井然有序。一個著重于客戶端的操作即測試手段,一個著重于應用系統(tǒng)的處理能力即查看對象;(上面的討論沒有考慮兩者的單位,如一個用戶同時有多個請求情況)