Nginx源碼研究之nginx限流模塊詳解

這篇文章主要介紹了Nginx源碼研究之nginx限流模塊詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

高并發(fā)系統(tǒng)有三把利器:緩存、降級和限流;

限流的目的是通過對并發(fā)訪問/請求進行限速來保護系統(tǒng),一旦達(dá)到限制速率則可以拒絕服務(wù)(定向到錯誤頁)、排隊等待(秒殺)、降級(返回兜底數(shù)據(jù)或默認(rèn)數(shù)據(jù));

高并發(fā)系統(tǒng)常見的限流有:限制總并發(fā)數(shù)(數(shù)據(jù)庫連接池)、限制瞬時并發(fā)數(shù)(如nginx的limit_conn模塊,用來限制瞬時并發(fā)連接數(shù))、限制時間窗口內(nèi)的平均速率(nginx的limit_req模塊,用來限制每秒的平均速率);

另外還可以根據(jù)網(wǎng)絡(luò)連接數(shù)、網(wǎng)絡(luò)流量、CPU或內(nèi)存負(fù)載等來限流。

1.限流算法

最簡單粗暴的限流算法就是計數(shù)器法了,而比較常用的有漏桶算法和令牌桶算法;

1.1計數(shù)器

計數(shù)器法是限流算法里最簡單也是最容易實現(xiàn)的一種算法。比如我們規(guī)定,對于A接口來說,我們1分鐘的訪問次數(shù)不能超過100個。

那么我們我們可以設(shè)置一個計數(shù)器counter,其有效時間為1分鐘(即每分鐘計數(shù)器會被重置為0),每當(dāng)一個請求過來的時候,counter就加1,如果counter的值大于100,就說明請求數(shù)過多;

這個算法雖然簡單,但是有一個十分致命的問題,那就是臨界問題。

如下圖所示,在1:00前一刻到達(dá)100個請求,1:00計數(shù)器被重置,1:00后一刻又到達(dá)100個請求,顯然計數(shù)器不會超過100,所有請求都不會被攔截;

然而這一時間段內(nèi)請求數(shù)已經(jīng)達(dá)到200,遠(yuǎn)超100。

1.2 漏桶算法

如下圖所示,有一個固定容量的漏桶,按照常量固定速率流出水滴;如果桶是空的,則不會流出水滴;流入到漏桶的水流速度是隨意的;如果流入的水超出了桶的容量,則流入的水會溢出(被丟棄);

可以看到漏桶算法天生就限制了請求的速度,可以用于流量整形和限流控制;

1.3 令牌桶算法

令牌桶是一個存放固定容量令牌的桶,按照固定速率r往桶里添加令牌;桶中最多存放b個令牌,當(dāng)桶滿時,新添加的令牌被丟棄;

當(dāng)一個請求達(dá)到時,會嘗試從桶中獲取令牌;如果有,則繼續(xù)處理請求;如果沒有則排隊等待或者直接丟棄;

可以發(fā)現(xiàn),漏桶算法的流出速率恒定或者為0,而令牌桶算法的流出速率卻有可能大于r;

2.nginx基礎(chǔ)知識

Nginx主要有兩種限流方式:按連接數(shù)限流(ngx_http_limit_conn_module)、按請求速率限流(ngx_http_limit_req_module);

學(xué)習(xí)限流模塊之前還需要了解nginx對HTTP請求的處理過程,nginx事件處理流程等;

2.1HTTP請求處理過程

nginx將HTTP請求處理流程分為11個階段,絕大多數(shù)HTTP模塊都會將自己的handler添加到某個階段(其中有4個階段不能添加自定義handler),nginx處理HTTP請求時會挨個調(diào)用所有的handler;

typedef enum { NGX_HTTP_POST_READ_PHASE = 0, //目前只有realip模塊會注冊handler(nginx作為代理服務(wù)器時有用,后端以此獲取客戶端原始ip) NGX_HTTP_SERVER_REWRITE_PHASE, //server塊中配置了rewrite指令,重寫url NGX_HTTP_FIND_CONFIG_PHASE, //查找匹配location;不能自定義handler;NGX_HTTP_REWRITE_PHASE, //location塊中配置了rewrite指令,重寫url NGX_HTTP_POST_REWRITE_PHASE, //檢查是否發(fā)生了url重寫,如果有,重新回到FIND_CONFIG階段;不能自定義handler; NGX_HTTP_PREACCESS_PHASE, //訪問控制,限流模塊會注冊handler到此階段 NGX_HTTP_ACCESS_PHASE, //訪問權(quán)限控制 NGX_HTTP_POST_ACCESS_PHASE, //根據(jù)訪問權(quán)限控制階段做相應(yīng)處理;不能自定義handler; NGX_HTTP_TRY_FILES_PHASE, //只有配置了try_files指令,才會有此階段;不能自定義handler; NGX_HTTP_CONTENT_PHASE, //內(nèi)容產(chǎn)生階段,返回響應(yīng)給客戶端 NGX_HTTP_LOG_PHASE //日志記錄} ngx_http_phases;

文章來源:文章來源:搜索引擎大全http://www.iis7.com/b/ssyqdq/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容