国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > Nginx > 正文

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

2024-08-30 12:23:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了Nginx源碼研究之nginx限流模塊詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

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

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

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

1.限流算法

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

1.1計(jì)數(shù)器

計(jì)數(shù)器法是限流算法里最簡(jiǎn)單也是最容易實(shí)現(xiàn)的一種算法。比如我們規(guī)定,對(duì)于A接口來(lái)說(shuō),我們1分鐘的訪問(wèn)次數(shù)不能超過(guò)100個(gè)。

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

這個(gè)算法雖然簡(jiǎn)單,但是有一個(gè)十分致命的問(wèn)題,那就是臨界問(wèn)題。

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

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

1.2 漏桶算法

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

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

1.3 令牌桶算法

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

當(dāng)一個(gè)請(qǐng)求達(dá)到時(shí),會(huì)嘗試從桶中獲取令牌;如果有,則繼續(xù)處理請(qǐng)求;如果沒(méi)有則排隊(duì)等待或者直接丟棄;

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

2.nginx基礎(chǔ)知識(shí)

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

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

2.1HTTP請(qǐng)求處理過(guò)程

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

typedef enum { NGX_HTTP_POST_READ_PHASE = 0, //目前只有realip模塊會(huì)注冊(cè)handler(nginx作為代理服務(wù)器時(shí)有用,后端以此獲取客戶端原始ip)  NGX_HTTP_SERVER_REWRITE_PHASE, //server塊中配置了rewrite指令,重寫(xiě)url  NGX_HTTP_FIND_CONFIG_PHASE, //查找匹配location;不能自定義handler; NGX_HTTP_REWRITE_PHASE,  //location塊中配置了rewrite指令,重寫(xiě)url NGX_HTTP_POST_REWRITE_PHASE, //檢查是否發(fā)生了url重寫(xiě),如果有,重新回到FIND_CONFIG階段;不能自定義handler;  NGX_HTTP_PREACCESS_PHASE,  //訪問(wèn)控制,限流模塊會(huì)注冊(cè)handler到此階段  NGX_HTTP_ACCESS_PHASE,  //訪問(wèn)權(quán)限控制 NGX_HTTP_POST_ACCESS_PHASE, //根據(jù)訪問(wèn)權(quán)限控制階段做相應(yīng)處理;不能自定義handler;  NGX_HTTP_TRY_FILES_PHASE,  //只有配置了try_files指令,才會(huì)有此階段;不能自定義handler; NGX_HTTP_CONTENT_PHASE,  //內(nèi)容產(chǎn)生階段,返回響應(yīng)給客戶端  NGX_HTTP_LOG_PHASE   //日志記錄} ngx_http_phases;
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绵竹市| 桓台县| 靖江市| 林口县| 和政县| 广昌县| 浦东新区| 绵阳市| 扬州市| 温泉县| 永州市| 吉隆县| 崇礼县| 来安县| 卫辉市| 新丰县| 瓮安县| 临泉县| 霍林郭勒市| 寿光市| 陆丰市| 邵东县| 饶平县| 安徽省| 剑川县| 黄梅县| 光泽县| 电白县| 泽普县| 新民市| 荥经县| 安顺市| 康平县| 本溪市| 洪洞县| 交城县| 浠水县| 峡江县| 大余县| 宜良县| 晋城|