就秒殺接口來講,當訪問頻率或者併發請求超過其承受範圍的時候,這時候咱們就要考慮限流來保證接口的可用性,以防止非預期的請求對系統壓力過大而引發的系統癱瘓。一般的策略就是拒絕多餘的訪問,或者讓多餘的訪問排隊等待服務。下面是幾種常見的限流技術算法
1、限流算法
經常使用的限流算法有:令牌桶,漏桶
1.令牌桶
令牌桶算法是網絡流量整形和速率限制中最常使用的一種算法。典型狀況下,令牌桶算法用來控制發送到網絡上的數據的數目,並容許突發數據的發送。tomcat
在秒殺活動中,用戶的請求速率是不固定的,這裏咱們假定爲10r/s,令牌按照5個每秒的速率放入令牌桶,桶中最多存放20個令牌。仔細想一想,是否是總有那麼一部分請求被丟棄。
2.漏桶
漏桶算法的主要目的是控制數據注入到網絡的速率,平滑網絡上的突發流量。漏桶算法提供了一種機制,經過它,突發流量能夠被整形以便爲網絡提供一個穩定的流量服務器
2、應用限流
Tomcat
在Tomcat容器中,咱們能夠經過自定義線程池,配置最大鏈接數,請求處理隊列等參數來達到限流的目的。
Tomcat默認使用自帶的鏈接池,這裏咱們也能夠自定義實現,打開/conf/server.xml文件,在Connector以前配置一個線程池:網絡
name:共享線程池的名字。這是Connector爲了共享線程池要引用的名字,該名字必須惟一。默認值:None;
namePrefix:在JVM上,每一個運行線程均可以有一個name 字符串。這一屬性爲線程池中每一個線程的name字符串設置了一個前綴,Tomcat將把線程號追加到這一前綴的後面。默認值:tomcat-exec-;
maxThreads:該線程池能夠容納的最大線程數。默認值:200;
maxIdleTime:在Tomcat關閉一個空閒線程以前,容許空閒線程持續的時間(以毫秒爲單位)。只有當前活躍的線程數大於minSpareThread的值,纔會關閉空閒線程。默認值:60000(一分鐘)。
minSpareThreads:Tomcat應該始終打開的最小不活躍線程數。默認值:25。
配置Connectorsession
• executor:表示使用該參數值對應的線程池;
• minProcessors:服務器啓動時建立的處理請求的線程數;
• maxProcessors:最大能夠建立的處理請求的線程數;
• acceptCount:指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。併發
3、API限流
秒殺活動中,接口的請求量會是平時的數百倍甚至數千倍,從而有可能致使接口不可用,並引起連鎖反應致使整個系統崩潰,甚至有可能會影響到其它服務。
那麼如何應對這種忽然事件呢?這裏咱們採用開源工具包guava提供的限流工具類RateLimiter進行API限流,該類基於"令牌桶算法",開箱即用。分佈式
自定義定義註解工具
自定義切面spa
4、分佈式限流線程
Nginx
如何使用Nginx實現基本的限流,好比單個IP限制每秒訪問50次。經過Nginx限流模塊,咱們能夠設置一旦併發鏈接數超過咱們的設置,將返回503錯誤給客戶端。
配置說明
imit_conn_zone
是針對每一個IP定義一個存儲session狀態的容器。這個示例中定義了一個100m的容器,按照32bytes/session,能夠處理3200000個session。
limit_rate 300k;
對每一個鏈接限速300k. 注意,這裏是對鏈接限速,而不是對IP限速。若是一個IP容許兩個併發鏈接,那麼這個IP就是限速limit_rate×2。
burst=5;這至關於桶的大小,若是某個請求超過了系統處理速度,會被放入桶中,等待被處理。若是桶滿了,那麼抱歉,請求直接返回503,客戶端獲得一個服務器忙的響應。若是系統處理請求的速度比較慢,桶裏的請求也不能一直待在裏面,若是超過必定時間,也是會被直接退回,返回服務器忙的響應。