面試官:連漏桶算法和令牌桶算法都不知道嗎?回去多看看書吧
今天的面試題主要關(guān)于nginx中的限流是怎么做到的,下面請看內(nèi)容吧:
====nginx中限流怎么做的?
Nginx限流就是限制用戶請求速度,防止服務器受不了
限流有3種:
1. 正常限制訪問頻率(正常流量)
2. 突發(fā)限制訪問頻率(突發(fā)流量)
3. 限制并發(fā)連接數(shù)
Nginx的限流都是基于漏桶流算法
實現(xiàn)三種限流算法
1、正常限制訪問頻率(正常流量):
限制一個用戶發(fā)送的請求,我Nginx多久接收一個請求。
Nginx中使用ngx_http_limit_req_module模塊來限制的訪問頻率,限制的原理實質(zhì)是基于漏桶算法原理來實現(xiàn)的。在nginx.conf配置文件中可以使用limit_req_zone命令及l(fā)imit_req命令限制單個IP的請求處理頻率。
?
#定義限流維度,一個用戶一分鐘一個請求進來,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
#綁定限流維度
server{
location/seckill.html{
limit_req zone=zone;
proxy_pass http://lj_seckill;
}
}
1r/s代表1秒一個請求,1r/m一分鐘接收一個請求, 如果Nginx這時還有別人的請求沒有處理完,Nginx就會拒絕處理該用戶請求。
?
2、突發(fā)限制訪問頻率(突發(fā)流量):
限制一個用戶發(fā)送的請求,我Nginx多久接收一個。
上面的配置一定程度可以限制訪問頻率,但是也存在著一個問題:如果突發(fā)流量超出請求被拒絕處理,無法處理活動時候的突發(fā)流量,這時候應該如何進一步處理呢?Nginx提供burst參數(shù)結(jié)合nodelay參數(shù)可以解決流量突發(fā)的問題,可以設置能處理的超過設置的請求數(shù)外能額外處理的請求數(shù)。我們可以將之前的例子添加burst參數(shù)以及nodelay參數(shù):
#定義限流維度,一個用戶一分鐘一個請求進來,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
#綁定限流維度
server{
location/seckill.html{
limit_req zone=zone burst=5 nodelay;
proxy_pass http://lj_seckill;
}
}
為什么就多了一個 burst=5 nodelay; 呢,多了這個可以代表Nginx對于一個用戶的請求會立即處理前五個,多余的就慢慢來落,沒有其他用戶的請求我就處理你的,有其他的請求的話我Nginx就漏掉不接受你的請求
?
3、限制并發(fā)連接數(shù)
Nginx中的ngx_http_limit_conn_module模塊提供了限制并發(fā)連接數(shù)的功能,可以使用
limit_conn_zone指令以及l(fā)imit_conn執(zhí)行進行配置。接下來我們可以通過一個簡單的例子來看下:
http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.lijie.net permanent;
}
}
上面配置了單個IP同時并發(fā)連接數(shù)最多只能10個連接,并且設置了整個虛擬服務器同時最大并發(fā)數(shù)最多只能100個鏈接。當然,只有當請求的header被服務器處理后,虛擬服務器的連接數(shù)才會計數(shù)。實際上限流一般都是基于漏桶算法和令牌桶算法實現(xiàn)的。
?
====講一講漏桶流算法和令牌桶算法?
1)漏桶算法是網(wǎng)絡世界中流量整形或速率限制時經(jīng)常使用的一種算法,它的主要目的是控制數(shù)據(jù)注入到網(wǎng)絡的速率,平滑網(wǎng)絡上的突發(fā)流量。漏桶算法提供了一種機制,通過它,突發(fā)流量可以被整形以便為網(wǎng)絡提供一個穩(wěn)定的流量。也就是我們剛才所講的情況。漏桶算法提供的機制實際上就是剛才的案例:突發(fā)流量會進入到一個漏桶,漏桶會按照我們定義的速率依次處理請求,如果水流過大也就是突發(fā)流量過大就會直接溢出,則多余的請求會被拒絕。所以漏桶算法能控制數(shù)據(jù)的傳輸速率。
2)令牌桶算法是網(wǎng)絡流量整形和速率限制中最常使用的一種算法。典型情況下,令牌桶算法用來控制發(fā)送到網(wǎng)絡上的數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送。Google開源項目Guava中的RateLimiter使用的就是令牌桶控制算法。令牌桶算法的機制如下:存在一個大小固定的令牌桶,會以恒定的速率源源不斷產(chǎn)生令牌。如果令牌消耗速率小于生產(chǎn)令牌的速度,令牌就會一直產(chǎn)生直至裝滿整個令牌桶。如果請求獲取令牌失敗則請求會被禁止訪問。
?
====什么是動靜分離?為什么要做動靜分離?
Nginx是當下最熱的Web容器,網(wǎng)站優(yōu)化的重要點在于靜態(tài)化網(wǎng)站,網(wǎng)站靜態(tài)化的關(guān)鍵點則是是動靜分離,動靜分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后,我們則根據(jù)靜態(tài)資源的特點將其做緩存操作。
讓靜態(tài)的資源只走靜態(tài)資源服務器,動態(tài)的走動態(tài)的服務器
Nginx的靜態(tài)處理能力很強,但是動態(tài)處理能力不足,因此,在企業(yè)中常用動靜分離技術(shù)。
對于靜態(tài)資源比如圖片,js,css等文件,我們則在反向代理服務器nginx中進行緩存。這樣瀏覽器在請求一個靜態(tài)資源時,代理服務器nginx就可以直接處理,無需將請求轉(zhuǎn)發(fā)給后端服務器tomcat。 若用戶請求的動態(tài)文件,比如servlet,jsp則轉(zhuǎn)發(fā)給Tomcat服務器處理,從而實現(xiàn)動靜分離。這也是反向代理服務器的一個重要的作用。
?
更多面試題或?qū)W習資源可查看我主頁或評論獲取