Nginx原始碼研究之nginx限流模組詳解

03ngnntds發表於2019-04-23

這篇文章主要介紹了Nginx原始碼研究之nginx限流模組詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
高併發系統有三把利器:快取、降級和限流;

限流的目的是透過對併發訪問/請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務(定向到錯誤頁)、排隊等待(秒殺)、降級(返回兜底資料或預設資料);

高併發系統常見的限流有:限制總併發數(資料庫連線池)、限制瞬時併發數(如nginx的limit_conn模組,用來限制瞬時併發連線數)、限制時間視窗內的平均速率(nginx的limit_req模組,用來限制每秒的平均速率);

另外還可以根據網路連線數、網路流量、CPU或記憶體負載等來限流。

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

1.1計數器

計數器法是限流演算法裡最簡單也是最容易實現的一種演算法。比如我們規定,對於A介面來說,我們1分鐘的訪問次數不能超過100個。

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

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

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

然而這一時間段內請求數已經達到200,遠超100。
在這裡插入圖片描述

1.2 漏桶演算法

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

可以看到漏桶演算法天生就限制了請求的速度,可以用於流量整形和限流控制;
在這裡插入圖片描述

1.3 令牌桶演算法

令牌桶是一個存放固定容量令牌的桶,按照固定速率r往桶裡新增令牌;桶中最多存放b個令牌,當桶滿時,新新增的令牌被丟棄;

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

可以發現,漏桶演算法的流出速率恆定或者為0,而令牌桶演算法的流出速率卻有可能大於r;
在這裡插入圖片描述

2.nginx基礎知識
Nginx主要有兩種限流方式:按連線數限流(ngx_http_limit_conn_module)、按請求速率限流(ngx_http_limit_req_module);

學習限流模組之前還需要了解nginx對HTTP請求的處理過程,nginx事件處理流程等;

2.1HTTP請求處理過程

nginx將HTTP請求處理流程分為11個階段,絕大多數HTTP模組都會將自己的handler新增到某個階段(其中有4個階段不能新增自定義handler),nginx處理HTTP請求時會挨個呼叫所有的handler;

typedef enum { NGX_HTTP_POST_READ_PHASE = 0, //目前只有realip模組會註冊handler(nginx作為代理伺服器時有用,後端以此獲取客戶端原始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, //檢查是否發生了url重寫,如果有,重新回到FIND_CONFIG階段;不能自定義handler; NGX_HTTP_PREACCESS_PHASE, //訪問控制,限流模組會註冊handler到此階段 NGX_HTTP_ACCESS_PHASE, //訪問許可權控制 NGX_HTTP_POST_ACCESS_PHASE, //根據訪問許可權控制階段做相應處理;不能自定義handler; NGX_HTTP_TRY_FILES_PHASE, //只有配置了try_files指令,才會有此階段;不能自定義handler; NGX_HTTP_CONTENT_PHASE, //內容產生階段,返回響應給客戶端 NGX_HTTP_LOG_PHASE //日誌記錄} ngx_http_phases;

文章來源:搜尋引擎大全


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69911024/viewspace-2642212/,如需轉載,請註明出處,否則將追究法律責任。

相關文章