電商平臺營銷時候,經常會碰到的大流量問題,除了做流量分流處理,可能還要做用戶黑白名單、信譽分析,進而根據用戶ip信譽權重做相應的流量攔截、限制流量。
nginx自身有的請求限制模塊ngx_http_limit_req_module、流量限制模塊ngx_stream_limit_conn_module基于令牌桶算法,可以方便的控制令牌速率,自定義調節限流,實現基本的限流控制。
算法思想是:
令牌以固定速率產生,并緩存到令牌桶中;
令牌桶放滿時,多余的令牌被丟棄;
請求要消耗等比例的令牌才能被處理;
令牌不夠時,請求被緩存。
漏桶算法:
算法思想是:
水(請求)從上方倒入水桶,從水桶下方流出(被處理);
來不及流出的水存在水桶中(緩沖),以固定速率流出;水桶滿后水溢出(丟棄)。
這個算法的核心是:緩存請求、勻速處理、多余的請求直接丟棄。
相比漏桶算法,令牌桶算法不同之處在于它不但有一只“桶”,還有個隊列,這個桶是用來存放令牌的,隊列才是用來存放請求的。
從作用上來說,漏桶和令牌桶算法最明顯的區別就是是否允許突發流量(burst)的處理,漏桶算法能夠強行限制數據的實時傳輸(處理)速率,對突發流量不做額外處理;而令牌桶算法能夠在限制數據的平均傳輸速率的同時允許某種程度的突發傳輸。
Nginx按請求速率限速模塊使用的是漏桶算法,即能夠強行保證請求的實時處理速度不會超過設置的閾值。
Nginx官方版本限制IP的連接和并發分別有兩個模塊:
limit_req_zone?用來限制單位時間內的請求數,即速率限制,采用的漏桶算法 “leaky bucket”。
limit_req_conn?用來限制同一時間連接數,即并發限制。
更多Nginx相關技術文章,請訪問Nginx使用教程欄目進行學習!?