平台限流演算法
㈠ 美蘭北大青鳥分享分布式限流的運行原理
分布式編程架構技術我們在前幾期的文章中已經給大家簡單分析過很多次了,今天我們就一起來了解一下API網關分布式限流的運行原理都有哪些。
API網關中針對一個API、API分組、接入應用APPID,IP等進行限流。
這些限流條件都將會產生一個限流使用的key,在後續的限流中都是對這個key進行限流。
限流演算法通常在API網關中可以採用令牌桶演算法實現。
必須說明一點的是分布式限流由於有網路的開銷,TPS的支持隔本地限流是有差距的,因此在對於TPS要求很高的場景,建議採用本地限流進行處理。
下面討論我們應該採用redis的哪一種分布式鎖的方案:由於redis事務要得到鎖的效果需要在高TPS時會產生大量的無效的訪問請求,所以不建議在這種場景下使用。
SETNX/EX的鎖方案會產生在過期時間的問題,同時也有非同步復制master數據到slave的問題。
相比lua方案會產生更多的不穩定性。
我建議採用lua的方案來實施分布式鎖,因為都是單進程單線程的執行,因此在TPS上和二種方案沒有大的區別,而且由於只是一個lua腳本在執行,甚至是可能純lua執行可能會有更高的TPS。
當然是lua腳本中可能還是會去設置過期時間,但是應用server宕機並不會影響到redis中的鎖。
當然master非同步復制的問題還是有,但是並不會造成問題,因為數據只會有1個lua腳本執行問題,下一個執行就正常了。
在實現方案的時候使用了Jedis庫,美蘭java課程http://www.kmbdqn.cn/認為有一些問題在方案的實現層面我已經去做過驗證了,可能也會是讀者的疑問。
㈡ 關於API網關(四)——限流
通俗的說,流量控制就是控制用戶請求的策略,主要包括:許可權、限流、流量調度。
許可權上一篇已經講過了,這一篇講限流,下一篇講流量調度。
限流是指限制用戶調用的頻率(QPS/QPM)或者次數。
流量限制,站在用戶或者運營的角度看,最直觀能感受到的作用是——收費
各大主流開放平台的對外API,一般都有一些免費的額度,可以供個人測試用,一旦想大規模調用,就需要付費購買更大的額度(頻率、次數),根據調用次數或者頻率進行收費。一旦超過擁有的額度,就會被限制調用。
其實這才是限流最大的用處,只是用戶或者運營同學無感,所以不太被大多數人了解。
網關後面是各個服務,各個服務的介面通過網關透出去給用戶調用。理論上說,用戶的流量是不可預知的,隨時可能來一波,一旦流量的峰值超過了服務的承載能力,服務就掛了,比如有大新聞發生時的某浪微博,比如前些年的12306.
所以, 網關必須保證,放過去到達後端服務的流量一定不可以超過服務可以承載的上限 。這個上限,是網關和各個服務協商出來的。
由簡到難,限流可以 分為單機限流、單集群限流、全集群限流 。
這里不討論具體的如漏桶、令牌桶等限流演算法,只說概念和思想。
單機限流的思想很簡單,就是每個機器的限流值 x 機器數量 = 總的限流值。
舉個例子,A用戶的QPS限制是100,網關部署了10台機器,那麼,每台機器限制10QPS就可以了。
先說好處,這種方法實現起來非常簡單,每台機器在本地內存計算qps就可以了,超過閾值就拒流。
不過單機限流的缺陷也十分明顯,主要體現在兩點:
當網關部署的機器數量發生變化時,每台機器的限流值需要根據機器數調整。現實中,因為擴容、縮容、機器宕機等原因,機器數的變化是常有的事。
單機限流的前提是,每台網關承載的用戶的流量是平均的,但是事實上,在某些時間,用戶的流量並不是完全平均分布在每台機器上的。
舉個例子:
10台機器,每台限qps10,其中3台每台實際qps是15,因為超限導致用戶流量被拒。其餘7台每台qps是7。這樣用戶總的qps = 15 * 3 + 7 * 7 = 94. 用戶qps並沒有超限,但是卻有一部分流量被拒了,這樣就很有問題。
實際上,單台限流的閾值也會設置的稍微大一些,以抵消流量不均的問題。
因為上面的問題, 單機限流通常作為一種兜底的備用手段,大多數時候用的還是集群限流 。
先來看一個示意圖:
相比單機限流,集群限流的計數工作上移到redis集群內進行,解決了單機限流的缺陷。
但是集群限流也不是完美的,因為引入了redis,那麼,當網關和redis之間的網路抖動、redis本身故障時,集群限流就失效了,這時候,還是得依靠單機限流進行兜底。
也就是說, 集群限流 + 單機限流配合,才是一個比穩妥的方案 。
接下來我們來思考這樣一個問題:大型網關一般都是多機房、多地域部署的,當然,後端的服務也是多機房、多地域部署的,在保護服務這一點來說,集群限流是夠用了。但是對用戶來說,還是有一些問題:
比如,用戶購買的QPS上限是30,我們的網關部署在中國北、中、南三個地域,那麼這30QPS怎麼分配呢?
平均肯定不行,用戶的流量可能是明顯不均衡的,比如用戶的業務主要集中在中國北方,那麼用戶的流量大部分都會進入北方的網關,網關如果限制QPS為10的話,用戶肯定來投訴。
那每個地域都限制為30行不行?也不行,如果用戶的流量比較均勻的分布在各個地域,那麼用戶購買了30QPS,實際上可能使用了90QPS,這太虧了。
按照解決單機限流流量不均的思路,搞一個公共的redis集群來計數行不行?
也不行,受限於信號傳播速度和天朝的廣闊疆域,每個流量都計數,肯定不現實,rt太高會導致限流失去意義,帶寬成本也會變得極其昂貴,對redis的規格要求也會很高。總之,很貴還解決不了問題。
有一種巧妙的解決辦法是:本地集群階梯計數 + 全集群檢查。
還是剛才的例子:
限流閾值時90,那麼三個地域各自計數,當本地域的數值達到30時,去其他兩個地域取一次對方當前的計數值,三個地域的計數值加起來,如果超了,告訴另外兩個地域超了,開始拒流。如果沒超,本地QPS每上漲10,重復一次上述的動作。
這樣就能有效的減少與redis的交互次數,同時實現了全地域真·集群限流。
當然,這種全地域集群限流,因為rt和階梯計數間隔的存在,一定是不準的,但是,比單集群限流還是好很多。
當某個用戶流量特別大的時候,redis計數就會遇到典型的熱點key問題,導致redis集群單節點壓力過大, 有兩種辦法可以解決這個問題:打散和抽樣。
打散是指,把熱點key加一些後綴,使其變成多個key,從而hash到不通的redis節點上,均攤壓力。
比如熱點key是abcd,那麼打散後,key變成了abcd1、abcd2、abcd3、abcd4。技術時,輪流加1、2、3、4的後綴就可以了。
抽樣是指,針對熱點key,不是每個每個請求到來時都進行計數,而是進行一個抽樣,比如每10個請求記一次數,這樣redis的壓力就會降低到十分之一。
說著把流量調度的也說完了哈哈,那下一篇再說說監控好了,順便推一下我現在在用的國產網關:GOKU,來自Eolinker。我覺得比KONG好用,感興趣的同學可以自行去了解一下。
www.eolinker.com
㈢ 銀川北大青鳥分享分布式限流的運行原理
分布式編程架構技術我們在前幾期的文章中已經給大家簡單分析過很多次了,今天我們就一起來了解一下API網關分布式限流的運行原理都有哪些。
API網關中針對一個API、API分組、接入應用APPID,IP等進行限流。
這些限流條件都將會產生一個限流使用的key,在後續的限流中都是對這個key進行限流。
限流演算法通常在API網關中可以採用令牌桶演算法實現。
必須說明一點的是分布式限流由於有網路的開銷,TPS的支持隔本地限流是有差距的,因此在對於TPS要求很高的場景,建議採用本地限流進行處理。
下面討論我們應該採用redis的哪一種分布式鎖的方案:由於redis事務要得到鎖的效果需要在高TPS時會產生大量的無效的訪問請求,所以不建議在這種場景下使用。
SETNX/EX的鎖方案會產生在過期時間的問題,同時也有非同步復制master數據到slave的問題。
相比lua方案會產生更多的不穩定性。
我建議採用lua的方案來實施分布式鎖,因為都是單進程單線程的執行,因此在TPS上和二種方案沒有大的區別,而且由於只是一個lua腳本在執行,甚至是可能純lua執行可能會有更高的TPS。
當然是lua腳本中可能還是會去設置過期時間,但是應用server宕機並不會影響到redis中的鎖。
當然master非同步復制的問題還是有,但是並不會造成問題,因為數據只會有1個lua腳本執行問題,下一個執行就正常了。
在實現方案的時候使用了Jedis庫,銀川java課程http://www.kmbdqn.cn/認為有一些問題在方案的實現層面我已經去做過驗證了,可能也會是讀者的疑問。
㈣ 限流演算法
計數器是一種最簡單限流演算法,其原理就是:在一段時間間隔內,對請求進行計數,與閥值進行比較判斷是否需要限流,一旦到了時間臨界點,將計數器清零。
這種方法雖然簡單,但也有個大問題就是沒有很好的處理單位時間的邊界。
滑動窗口是針對計數器存在的臨界點缺陷,所謂 滑動窗口(Sliding window) 是一種流量控制技術,這個詞出現在 TCP 協議中。滑動窗口把固定時間片進行劃分,並且隨著時間的流逝,進行移動,固定數量的可以移動的格子,進行計數並判斷閥值。
假設一個時間窗口是一分鍾,每個時間窗口有 6 個格子,每個格子是 10 秒鍾。每過 10 秒鍾時間窗口向右移動一格。我們為每個格子都設置一個獨立的計數器 Counter,假如一個請求在 0:45 訪問了那麼我們將第五個格子的計數器 +1(也是就是 0:40~0:50),在判斷限流的時候需要把所有格子的計數加起來和設定的頻次進行比較即可。
想讓限流做的更精確只需要劃分更多的格子就可以了,為了更精確我們也不知道到底該設置多少個格子,格子的數量影響著滑動窗口演算法的精度,依然有時間片的概念,無法根本解決臨界點問題。
漏桶演算法(Leaky Bucket),原理就是一個固定容量的漏桶,按照固定速率流出水滴。用過水龍頭都知道,打開龍頭開關水就會流下滴到水桶里,而漏桶指的是水桶下面有個漏洞可以出水。如果水龍頭開的特別大那麼水流速就會過大,這樣就可能導致水桶的水滿瞭然後溢出。
一個固定容量的桶,有水流進來,也有水流出去。對於流進來的水來說,我們無法預計一共有多少水會流進來,也無法預計水流的速度。但是對於流出去的水來說,這個桶可以固定水流出的速率(處理速度),從而達到 流量整形 和 流量控制 的效果。
漏桶演算法有以下特點:
漏桶限制的是常量流出速率(即流出速率是一個固定常量值),所以最大的速率就是出水的速率,不能出現突發流量。
令牌桶演算法(Token Bucket)是網路流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種演算法。典型情況下,令牌桶演算法用來控制發送到網路上的數據的數目,並允許突發數據的發送。
我們有一個固定的桶,桶里存放著令牌(token)。一開始桶是空的,系統按固定的時間(rate)往桶里添加令牌,直到桶里的令牌數滿,多餘的請求會被丟棄。當請求來的時候,從桶里移除一個令牌,如果桶是空的則拒絕請求或者阻塞。
令牌桶有以下特點:
令牌桶限制的是平均流入速率(允許突發請求,只要有令牌就可以處理,支持一次拿3個令牌,4個令牌...),並允許一定程度突發流量。
參考:
https://mp.weixin.qq.com/s/GOZkM2PGctqim4sp_uIEsg
https://mp.weixin.qq.com/s/-wU7SA8Hjh1Y2vOySdgGJw
㈤ 分布式解決方案之:限流
限流在日常生活中限流很常見,例如去有些景區玩,每天售賣的門票數是有限的,例如 2000 張,即每天最多隻有 2000 個人能進去遊玩。那在我們工程上限流是什麼呢?限制的是 「流」,在不同場景下「流」的定義不同,可以是 每秒請求數、每秒事務處理數、網路流量 等等。通常意義我們說的限流指代的是限制到達系統的並發請求數,使得系統能夠正常的處理部分用戶的請求,來保證系統的穩定性。
日常的業務上有類似秒殺活動、雙十一大促或者突發新聞等場景,用戶的流量突增,後端服務的處理能力是有限的,如果不能處理好突發流量,後端服務很容易就被打垮。另外像爬蟲之類的不正常流量,我們對外暴露的服務都要以最大惡意為前提去防備調用者。我們不清楚調用者會如何調用我們的服務,假設某個調用者開幾十個線程一天二十四小時瘋狂調用你的服務,如果不做啥處理咱服務基本也玩完了,更勝者還有ddos攻擊。
對於很多第三方開放平台來說,不僅僅要防備不正常流量,還要保證資源的公平利用,一些介面資源不可能一直都被一個客戶端占著,也需要保證其他客戶端能正常調用。
計數器限流也就是最簡單的限流演算法就是計數限流了。例如系統能同時處理 100 個請求,保存一個計數器,處理了一個請求,計數器就加一,一個請求處理完畢之後計數器減一。每次請求來的時候看看計數器的值,如果超過閾值就拒絕。計數器的值要是存內存中就算單機限流演算法,如果放在第三方存儲里(例如Redis中)集群機器訪問就算分布式限流演算法。
一般的限流都是為了限制在指定時間間隔內的訪問量,因此還有個演算法叫固定窗口。
它相比於計數限流主要是多了個時間窗口的概念,計數器每過一個時間窗口就重置。規則如下:
這種方式也會面臨一些問題,例如固定窗口臨界問題:假設系統每秒允許 100 個請求,假設第一個時間窗口是 0-1s,在第 0.55s 處一下次湧入 100 個請求,過了 1 秒的時間窗口後計數清零,此時在 1.05 s 的時候又一下次湧入100個請求。雖然窗口內的計數沒超過閾值,但是全局來看在 0.55s-1.05s 這 0.1 秒內湧入了 200 個請求,這其實對於閾值是 100/s 的系統來說是無法接受的。
為了解決這個問題,業界又提出另外一種限流演算法,即滑動窗口限流。
滑動窗口限流解決固定窗口臨界值的問題,可以保證在任意時間窗口內都不會超過閾值。相對於固定窗口,滑動窗口除了需要引入計數器之外還需要記錄時間窗口內每個請求到達的時間點,因此對內存的佔用會比較多。
規則如下,假設時間窗口為 1 秒:
但是滑動窗口和固定窗口都無法解決短時間之內集中流量的沖擊問題。 我們所想的限流場景是: 每秒限制 100 個請求。希望請求每 10ms 來一個,這樣我們的流量處理就很平滑,但是真實場景很難控制請求的頻率,因為可能就算我們設置了1s內只能有100個請求,也可能存在 5ms 內就打滿了閾值的情況。當然對於這種情況還是有變型處理的,例如設置多條限流規則。不僅限制每秒 100 個請求,再設置每 10ms 不超過 2 個,不過帶來的就是比較差的用戶體驗。
而漏桶演算法,可以解決時間窗口類的痛點,使得流量更加平滑。
如下圖所示,水滴持續滴入漏桶中,底部定速流出。如果水滴滴入的速率大於流出的速率,當存水超過桶的大小的時候就會溢出。
規則如下:
水滴對應的就是請求。
與線程池實現的方式方式如出一轍。
面對突發請求,服務的處理速度和平時是一樣的,這並非我們實際想要的。我們希望的是在突發流量時,在保證系統平穩的同時,也要盡可能提升用戶體驗,也就是能更快地處理並響應請求,而不是和正常流量一樣循規蹈矩地處理。
而令牌桶在應對突擊流量的時候,可以更加的「激進」。
令牌桶其實和漏桶的原理類似,只不過漏桶是定速地流出,而令牌桶是定速地往桶里塞入令牌,然後請求只有拿到了令牌才能通過,之後再被伺服器處理。
當然令牌桶的大小也是有限制的,假設桶里的令牌滿了之後,定速生成的令牌會丟棄。
規則:
令牌桶的原理與JUC的Semaphore 信號量很相似,信號量可控制某個資源被同時訪問的個數,其實和拿令牌思想一樣,不同的是一個是拿信號量,一個是拿令牌。信號量用完了返還,而令牌用了不歸還,因為令牌會定時再填充。
對比漏桶演算法可以看出 令牌桶更適合應對突發流量 ,假如桶內有 100 個令牌,那麼這100個令牌可以馬上被取走,而不像漏桶那樣勻速的消費。不過上面批量獲取令牌也會致使一些新的問題出現,比如導致一定范圍內的限流誤差,舉個例子你取了 10 個此時不用,等下一秒再用,那同一時刻集群機器總處理量可能會超過閾值,所以現實中使用時,可能不會去考慮redis頻繁讀取問題,轉而直接採用一次獲取一個令牌的方式,具體採用哪種策略還是要根據真實場景而定。
1、計數器 VS 固定窗口 VS 滑動窗口
2、漏桶演算法 VS 令牌桶演算法
總的來說
單機限流和分布式限流本質上的區別在於 「閾值」 存放的位置,單機限流就是「閥值」存放在單機部署的服務/內存中,但我們的服務往往是集群部署的,因此需要多台機器協同提供限流功能。像上述的計數器或者時間窗口的演算法,可以將計數器存放至 Redis 等分布式 K-V 存儲中。又如滑動窗口的每個請求的時間記錄可以利用 Redis 的 zset 存儲,利用 ZREMRANGEBYSCORE 刪除時間窗口之外的數據,再用 ZCARD 計數,
可以看到,每個限流都有個閾值,這個閾值如何定是個難點。定大了伺服器可能頂不住,定小了就「誤殺」了,沒有資源利用最大化,對用戶體驗不好。一般的做法是限流上線之後先預估個大概的閾值,然後不執行真正的限流操作,而是採取日誌記錄方式,對日誌進行分析查看限流的效果,然後調整閾值,推算出集群總的處理能力,和每台機子的處理能力(方便擴縮容)。然後將線上的流量進行重放,測試真正的限流效果,最終閾值確定,然後上線。
其實真實的業務場景很復雜,需要限流的條件和資源很多,每個資源限流要求還不一樣。
一般而言,我們不需要自己實現限流演算法來達到限流的目的,不管是接入層限流還是細粒度的介面限流,都有現成的輪子使用,其實現也是用了上述我們所說的限流演算法。
具體的使用還是很簡單的,有興趣的同學可以自行搜索,對內部實現感興趣的同學可以下個源碼看看,學習下生產級別的限流是如何實現的。
限流具體應用到工程還是有很多點需要考慮的,並且限流只是保證系統穩定性中的一個環節,還需要配合降級、熔斷等相關內容。
㈥ 深圳北大青鳥分享分布式限流的運行原理
分布式編程架構技術我們在前幾期的文章中已經給大家簡單分析過很多次了,今天我們就一起來了解一下API網關分布式限流的運行原理都有哪些。
API網關中針對一個API、API分組、接入應用APPID,IP等進行限流。
這些限流條件都將會產生一個限流使用的key,在後續的限流中都是對這個key進行限流。
限流演算法通常在API網關中可以採用令牌桶演算法實現。
必須說明一點的是分布式限流由於有網路的開銷,TPS的支持隔本地限流是有差距的,因此在對於TPS要求很高的場景,建議採用本地限流進行處理。
下面討論我們應該採用redis的哪一種分布式鎖的方案:由於redis事務要得到鎖的效果需要在高TPS時會產生大量的無效的訪問請求,所以不建議在這種場景下使用。
SETNX/EX的鎖方案會產生在過期時間的問題,同時也有非同步復制master數據到slave的問題。
相比lua方案會產生更多的不穩定性。
我建議採用lua的方案來實施分布式鎖,因為都是單進程單線程的執行,因此在TPS上和二種方案沒有大的區別,而且由於只是一個lua腳本在執行,甚至是可能純lua執行可能會有更高的TPS。
當然是lua腳本中可能還是會去設置過期時間,但是應用server宕機並不會影響到redis中的鎖。
當然master非同步復制的問題還是有,但是並不會造成問題,因為數據只會有1個lua腳本執行問題,下一個執行就正常了。
在實現方案的時候使用了Jedis庫,深圳java課程http://www.kmbdqn.cn/認為有一些問題在方案的實現層面我已經去做過驗證了,可能也會是讀者的疑問。
㈦ 武漢北大青鳥分享分布式限流的運行原理
分布式編程架構技術我們在前幾期的文章中已經給大家簡單分析過很多次了,今天我們就一起來了解一下API網關分布式限流的運行原理都有哪些。
API網關中針對一個API、API分組、接入應用APPID,IP等進行限流。
這些限流條件都將會產生一個限流使用的key,在後續的限流中都是對這個key進行限流。
限流演算法通常在API網關中可以採用令牌桶演算法實現。
必須說明一點的是分布式限流由於有網路的開銷,TPS的支持隔本地限流是有差距的,因此在對於TPS要求很高的場景,建議採用本地限流進行處理。
下面討論我們應該採用redis的哪一種分布式鎖的方案:由於redis事務要得到鎖的效果需要在高TPS時會產生大量的無效的訪問請求,所以不建議在這種場景下使用。
SETNX/EX的鎖方案會產生在過期時間的問題,同時也有非同步復制master數據到slave的問題。
相比lua方案會產生更多的不穩定性。
我建議採用lua的方案來實施分布式鎖,因為都是單進程單線程的執行,因此在TPS上和二種方案沒有大的區別,而且由於只是一個lua腳本在執行,甚至是可能純lua執行可能會有更高的TPS。
當然是lua腳本中可能還是會去設置過期時間,但是應用server宕機並不會影響到redis中的鎖。
當然master非同步復制的問題還是有,但是並不會造成問題,因為數據只會有1個lua腳本執行問題,下一個執行就正常了。
在實現方案的時候使用了Jedis庫,武漢java課程http://www.kmbdqn.cn/認為有一些問題在方案的實現層面我已經去做過驗證了,可能也會是讀者的疑問。
㈧ 鄭州北大青鳥分享分布式限流的運行原理
分布式編程架構技術我們在前幾期的文章中已經給大家簡單分析過很多次了,今天我們就一起來了解一下API網關分布式限流的運行原理都有哪些。
API網關中針對一個API、API分組、接入應用APPID,IP等進行限流。
這些限流條件都將會產生一個限流使用的key,在後續的限流中都是對這個key進行限流。
限流演算法通常在API網關中可以採用令牌桶演算法實現。
必須說明一點的是分布式限流由於有網路的開銷,TPS的支持隔本地限流是有差距的,因此在對於TPS要求很高的場景,建議採用本地限流進行處理。
下面討論我們應該採用redis的哪一種分布式鎖的方案:由於redis事務要得到鎖的效果需要在高TPS時會產生大量的無效的訪問請求,所以不建議在這種場景下使用。
SETNX/EX的鎖方案會產生在過期時間的問題,同時也有非同步復制master數據到slave的問題。
相比lua方案會產生更多的不穩定性。
我建議採用lua的方案來實施分布式鎖,因為都是單進程單線程的執行,因此在TPS上和二種方案沒有大的區別,而且由於只是一個lua腳本在執行,甚至是可能純lua執行可能會有更高的TPS。
當然是lua腳本中可能還是會去設置過期時間,但是應用server宕機並不會影響到redis中的鎖。
當然master非同步復制的問題還是有,但是並不會造成問題,因為數據只會有1個lua腳本執行問題,下一個執行就正常了。
在實現方案的時候使用了Jedis庫,鄭州java課程http://www.kmbdqn.cn/認為有一些問題在方案的實現層面我已經去做過驗證了,可能也會是讀者的疑問。
㈨ 昌平北大青鳥分享分布式限流的運行原理
分布式編程架構技術我們在前幾期的文章中已經給大家簡單分析過很多次了,今天我們就一起來了解一下API網關分布式限流的運行原理都有哪些。
API網關中針對一個API、API分組、接入應用APPID,IP等進行限流。
這些限流條件都將會產生一個限流使用的key,在後續的限流中都是對這個key進行限流。
限流演算法通常在API網關中可以採用令牌桶演算法實現。
必須說明一點的是分布式限流由於有網路的開銷,TPS的支持隔本地限流是有差距的,因此在對於TPS要求很高的場景,建議採用本地限流進行處理。
下面討論我們應該採用redis的哪一種分布式鎖的方案:由於redis事務要得到鎖的效果需要在高TPS時會產生大量的無效的訪問請求,所以不建議在這種場景下使用。
SETNX/EX的鎖方案會產生在過期時間的問題,同時也有非同步復制master數據到slave的問題。
相比lua方案會產生更多的不穩定性。
我建議採用lua的方案來實施分布式鎖,因為都是單進程單線程的執行,因此在TPS上和二種方案沒有大的區別,而且由於只是一個lua腳本在執行,甚至是可能純lua執行可能會有更高的TPS。
當然是lua腳本中可能還是會去設置過期時間,但是應用server宕機並不會影響到redis中的鎖。
當然master非同步復制的問題還是有,但是並不會造成問題,因為數據只會有1個lua腳本執行問題,下一個執行就正常了。
在實現方案的時候使用了Jedis庫,昌平java課程http://www.kmbdqn.cn/認為有一些問題在方案的實現層面我已經去做過驗證了,可能也會是讀者的疑問。
㈩ 廣州北大青鳥分享分布式限流的運行原理
分布式編程架構技術我們在前幾期的文章中已經給大家簡單分析過很多次了,今天我們就一起來了解一下API網關分布式限流的運行原理都有哪些。
API網關中針對一個API、API分組、接入應用APPID,IP等進行限流。
這些限流條件都將會產生一個限流使用的key,在後續的限流中都是對這個key進行限流。
限流演算法通常在API網關中可以採用令牌桶演算法實現。
必須說明一點的是分布式限流由於有網路的開銷,TPS的支持隔本地限流是有差距的,因此在對於TPS要求很高的場景,建議採用本地限流進行處理。
下面討論我們應該採用redis的哪一種分布式鎖的方案:由於redis事務要得到鎖的效果需要在高TPS時會產生大量的無效的訪問請求,所以不建議在這種場景下使用。
SETNX/EX的鎖方案會產生在過期時間的問題,同時也有非同步復制master數據到slave的問題。
相比lua方案會產生更多的不穩定性。
我建議採用lua的方案來實施分布式鎖,因為都是單進程單線程的執行,因此在TPS上和二種方案沒有大的區別,而且由於只是一個lua腳本在執行,甚至是可能純lua執行可能會有更高的TPS。
當然是lua腳本中可能還是會去設置過期時間,但是應用server宕機並不會影響到redis中的鎖。
當然master非同步復制的問題還是有,但是並不會造成問題,因為數據只會有1個lua腳本執行問題,下一個執行就正常了。
在實現方案的時候使用了Jedis庫,廣州java課程http://www.kmbdqn.cn/認為有一些問題在方案的實現層面我已經去做過驗證了,可能也會是讀者的疑問。