1. 程式人生 > >高併發系統限流設計

高併發系統限流設計




概述

高併發系統時有三把利器用來保護系統:快取、降級和限流,快取的目的是提升系統訪問速度和增大系統能處理的容量,降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待高峰或者問題解決後再開啟,而有些場景並不能用快取和降級來解決,比如稀缺資源(秒殺、搶購)、寫服務(如評論、下單)、頻繁的複雜查詢(評論的最後幾頁),因此需有一種手段來限制這些場景的併發/請求量,即限流

限流的目的是通過對併發訪問/請求進行限速或者一個時間視窗內的的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務(定向到錯誤頁或告知資源沒有了)、排隊或等待(比如秒殺、評論、下單)、降級(返回託底資料或預設資料,如商品詳情頁庫存預設有貨)。

限流方式

  • 限制總併發數(比如資料庫連線池、執行緒池)
  • 限制瞬時併發數(如nginx的limit_conn模組,用來限制瞬時併發連線數)
  • 限制時間視窗內的平均速率(如Guava的RateLimiter、nginx的limit_req模組,限制每秒的平均速率)
  • 限制遠端介面呼叫速率
  • 限制MQ的消費速率。
  • 可以根據網路連線數、網路流量、CPU或記憶體負載等來限流

限流演算法

令牌桶

漏桶

計數器

有時候我們還使用計數器來進行限流,主要用來限制總併發數,比如資料庫連線池、執行緒池、秒殺的併發數;只要全域性總請求數或者一定時間段的總請求數設定的閥值則進行限流,是簡單粗暴的總數量限流,而不是平均速率限流

令牌桶vs漏桶

令牌桶限制的是平均流入速率,允許突發請求,並允許一定程度突發流量
漏桶限制的是常量流出速率,從而平滑突發流入速率

應用級別限流

限流總併發/連線/請求數

如果你使用過Tomcat,其Connector其中一種配置有如下幾個引數:
- acceptCount:如果Tomcat的執行緒都忙於響應,新來的連線會進入佇列排隊,如果超出排隊大小,則拒絕連線
- maxConnections:瞬時最大連線數,超出的會排隊等待
- maxThreads:Tomcat能啟動用來處理請求的最大執行緒數,如果請求處理量一直遠遠大於最大執行緒數則可能會僵死

限流總資源數

可以使用池化技術來限制總資源數:連線池、執行緒池。比如分配給每個應用的資料庫連線是100,那麼本應用最多可以使用100個資源,超出了可以等待或者拋異常

限流某個介面的總併發/請求數

可以使用Java中的AtomicLong,示意程式碼:

try{
if(atomic.incrementAndGet() > 限流數) {
//拒絕請求
}
//處理請求
}finally{
atomic.decrementAndGet();
}

限流某個介面的時間窗請求數

使用Guava的Cache,示意程式碼:

LoadingCache counter =
CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.SECONDS)
.build(newCacheLoader() {
@Override
publicAtomicLong load(Long seconds)throwsException {
return newAtomicLong(0);
}
});
longlimit =1000;
while(true) {
//得到當前秒longcurrentSeconds = System.currentTimeMillis() /1000;
if(counter.get(currentSeconds).incrementAndGet() > limit) {
System.out.println("限流了:"+ currentSeconds);
continue;
}
//業務處理
}

平滑限流某個介面的請求數

之前的限流方式都不能很好地應對突發請求,即瞬間請求可能都被允許從而導致一些問題;因此在一些場景中需要對突發請求進行整形,整形為平均速率請求處理

Guava框架提供了令牌桶演算法實現

Guava RateLimiter提供了令牌桶演算法實現:平滑突發限流(SmoothBursty)和平滑預熱限流(SmoothWarmingUp)實現

平滑突發限流(SmoothBursty)

RateLimiter limiter = RateLimiter.create(5);
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
System.out.println(limiter.acquire());
將得到類似如下的輸出:
0.0
0.198239
0.196083
0.200609
0.199599
0.19961

limiter.acquire(5)表示桶的容量為5且每秒新增5個令牌

平滑預熱限流(SmoothWarmingUp)

RateLimiter limiter = RateLimiter.create(5,1000, TimeUnit.MILLISECONDS);
for(inti =1; i <5;i++) {
System.out.println(limiter.acquire());
}
Thread.sleep(1000L);
for(inti =1; i <5;i++) {
System.out.println(limiter.acquire());
}
將得到類似如下的輸出:
0.0
0.51767
0.357814
0.219992
0.199984
0.0
0.360826
0.220166
0.199723
0.199555

SmoothWarmingUp建立方式:RateLimiter.create(doublepermitsPerSecond, long warmupPeriod, TimeUnit unit)
permitsPerSecond表示每秒新增的令牌數,warmupPeriod表示在從冷啟動速率過渡到平均速率的時間間隔。

速率是梯形上升速率的,也就是說冷啟動時會以一個比較大的速率慢慢到平均速率;然後趨於平均速率(梯形下降到平均速率)。可以通過調節warmupPeriod引數實現一開始就是平滑固定速率。

分散式限流

分散式限流最關鍵的是要將限流服務做成原子化,而解決方案可以使使用redis+lua或者nginx+lua技術進行實現

詳見參考文章

接入層限流

接入層通常指請求流量的入口,該層的主要目的有:負載均衡、非法請求過濾、請求聚合、快取、降級、限流、A/B測試、服務質量監控等等

對於Nginx接入層限流可以使用Nginx自帶了兩個模組:連線數限流模組ngx_http_limit_conn_module和漏桶演算法實現的請求限流模組ngx_http_limit_req_module。還可以使用OpenResty提供的Lua限流模組lua-resty-limit-traffic進行更復雜的限流場景。

limit_conn用來對某個KEY對應的總的網路連線數進行限流,可以按照如IP、域名維度進行限流。

limit_req用來對某個KEY對應的請求的平均速率進行限流,並有兩種用法:平滑模式(delay)和允許突發模式(nodelay)。

OpenResty提供的Lua限流模組lua-resty-limit-traffic進行更復雜的限流場景

詳見參考文章

(本文完)

參考自文章

相關推薦

併發系統設計

概述 高併發系統時有三把利器用來保護系統:快取、降級和限流,快取的目的是提升系統訪問速度和增大系統能處理的容量,降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待高峰或者問題解決後再開啟,而有些場景並不能用快取和降級來解決,比如

併發系統資料庫架構設計

在WEB網站的規模從小到大不斷擴充套件的過程中,資料庫的訪問壓力也不斷的增加,資料庫的架構也需要動態擴充套件,在資料庫的擴充套件過程基本上包含如下幾步,每一個擴充套件都可以比上一步驟的部署方式的效能得到數量級的提升。 1、WEB應用和資料庫部署在同一臺伺服

聊聊併發系統特技(二)(轉)

上一篇《聊聊高併發系統限流特技-1》講了限流演算法、應用級限流、分散式限流;本篇將介紹接入層限流實現。 接入層限流 接入層通常指請求流量的入口,該層的主要目的有:負載均衡、非法請求過濾、請求聚合、快取、降級、限流、 A/B 測試、服務質量監控

併發系統特技

在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。快取的目的是提升系統訪問速度和增大系統能處理的容量,可謂是抗高併發流量的銀彈;而降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待高峰或者問題解決後再開啟;而有些場景並不能用快取和降級來解決,比如稀缺資源(秒殺、搶購)、寫服務(如評論、

Java併發系統策略

概要在大資料量高併發訪問時,經常會出現服務或介面面對暴漲的請求而不可用的情況,甚至引發連鎖反映導致整個系統崩潰。此時你需要使用的技術手段之一就是限流,當請求達到一定的併發數或速率,就進行等待、排隊、降級、拒絕服務等。在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。快取快取比較好理解,在大型高併發系

聊聊併發系統特技

在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。快取的目的是提升系統訪問速度和增大系統能處理的容量,可謂是抗高併發流量的銀彈;而降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待高峰或者問題解決後再開啟;而有些場景並不能用快取和降級來解決,比如

談談併發系統

開濤大神在部落格中說過:在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。本文結合作者的一些經驗介紹限流的相關概念、演算法和常規的實現方式。快取快取比較好理解,在大型高併發系統中,如果沒有快取資料庫將分分鐘被爆,系統也會瞬間癱瘓。使用快取不單單能夠提升系統訪問速度、

併發系統特技:有了它,京東6.18如虎添翼!

轉載 ------ 2016-06-24 張開濤相關文章 在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。快取的目的是提升系統訪問速度和增大系統能處理的容量,可謂是抗高併發流量的銀彈;而降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待高峰或者問

架構學習之路——可用併發系統設計原則 (轉)

作者 Geekwolf 本文作者為網易高階運維工程師 本文主要是學習開濤《億級流量網站架構核心技術》一書學習筆記及自己的感悟: 架構設計三大定律 墨菲定律 - 任何事沒有表面看起來那麼簡單 - 所有的事都會比預計的時間長 - 可能出錯的事情總會出錯 - 擔心

併發系統設計與時間和空間的平衡

    高併發系統設計與時間和空間的平衡 高可用上文我們已經講過了,可當前網際網路時代,怎麼少的了高併發呢?高併發和高可用一樣, 已經變成各個系統的標配了,如果你的系統QPS沒有個大幾千上萬,都不好意思跟人打招呼,雖然可能每天的呼叫量不超過100。  

如何設計一個併發系統

  系統拆分,將一個系統拆分為多個子系統,用dubbo來搞。然後每個系統連一個數據庫,這樣本來就一個庫,現在多個數據庫,不也可以抗高併發麼。     快取,必須得用快取。大部分的高併發場景,都是讀多寫少,那你完全可以在資料庫和快取裡都寫一份,然後讀的時候大量走快取不就得了。畢竟人家redis

【本人禿頂程式設計師】面試題:如何設計一個併發系統

←←←←←←←←←←←← 我都禿頂了,還不點關注! 面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 裡都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在網際

【架構】可用併發系統設計原則

網際網路架構下的【高可用高併發】系統設計原則,希望對你有用。   ------------------------------------------------------ ------------------------------------

架構學習之路——可用併發系統設計原則

本系列部落格主要是學習開濤《億級流量網站架構核心技術》一書學習筆記及自己的感悟: 架構設計三大定律 墨菲定律 – 任何事沒有表面看起來那麼簡單 – 所有的事都會比預計的時間長 – 可能出錯的事情總會出錯 – 擔心某種事情發生,那麼它就更有可能發生 康威定律 – 系統架構師公司組織架構的反映 – 按照

網際網路併發系統下的安全認證架構設計

使用的工具是Wireshark,這是一個網路封包分析軟體,用於擷取網路封包,並儘可能顯示出最為詳

41、如何設計一個併發系統

1、面試題 如何設計一個高併發系統? 2、面試官心裡分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的jd裡都是說啥,有高併發就經驗者優先。 所以如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿offer基本如探囊

程式設計師修神之路--併發系統設計負載均衡架構

菜菜哥,上次你給我講的分庫分表策略對我幫助很大 有幫助就好,上次請我的咖啡也很好喝~ 呵呵,不過隨著訪問量的不斷加大,網站我又加了nginx做負載均衡 好呀,看來要進階高階工程師啦~ 負載均衡也很簡單呀,一個nginx就搞定了,現在可以說我精通負載均衡了吧 其實負載均衡的內容還有很多 一個系統

如何設計一個併發系統

面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 裡都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在網際網路公司裡幹過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官也絕對不

並發算法

數據包 用戶 bsp memory 錯誤頁面 mage 性能 設定 size 開篇 在高並發系統中,有很多手段來保護系統,如緩存、降級和限流等。 緩存:讓數據盡早進入緩存,離程序近一點,不要大量頻繁的訪問DB,可提供系統訪問速度和增大系統處理能力。 降級:當服務出問題或者影

聊聊併發系統之降級特技(轉)

在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。之前已經有一些文章介紹過快取和限流了。本文將詳細聊聊降級。當訪問量劇增、服務出現問題(如響應時間慢或不響應)或非核心服務影響到核心流程的效能時,仍然需要保證服務還是可用的,即使是有損服務。系統可以根據一些關鍵資料進行自動降級,也