什么是服務(wù)限流
讓我們先看一看系統(tǒng)架構(gòu)設(shè)計(jì)中,為什么要做“限流”。
旅游景點(diǎn)通常都會(huì)有最大的接待量,不可能無限制的放游客進(jìn)入,比如故宮每天只賣八萬張票,超過八萬的游客,無法買票進(jìn)入,因?yàn)槿绻^八萬人,景點(diǎn)的工作人員可能就忙不過來,過于擁擠的景點(diǎn)也會(huì)影響游客的體驗(yàn)和心情,并且還會(huì)有安全隱患;只賣N張票,這就是一種限流的手段。
軟件架構(gòu)中的服務(wù)限流也是類似,也是當(dāng)系統(tǒng)資源不夠的時(shí)候,已經(jīng)不足以應(yīng)對(duì)大量的請(qǐng)求,為了保證服務(wù)還能夠正常運(yùn)行,那么按照規(guī)則,系統(tǒng)會(huì)把多余的請(qǐng)求直接拒絕掉,以達(dá)到限流的效果;
不知道大家注意過沒有,比如雙11,剛過12點(diǎn)有些顧客的網(wǎng)頁(yè)或APP會(huì)顯示下單失敗的提示,有些就是被限流調(diào)了。
服務(wù)限流算法有哪些
計(jì)數(shù)器法:原理就是限制每秒處理請(qǐng)求數(shù)不超過閾值。比如一個(gè)接口一分鐘可以處理1000次請(qǐng)求,那么可以設(shè)置一個(gè)計(jì)數(shù)器,當(dāng)有一次請(qǐng)求過來,計(jì)數(shù)器就加1,如果一分鐘以內(nèi)計(jì)數(shù)器超過了1000,那么后面再過來的請(qǐng)求就不再處理;但是這個(gè)方法的缺點(diǎn)也很明顯,因?yàn)檎?qǐng)求的訪問不一定是很平穩(wěn)的,如果0:59過來了1000個(gè)請(qǐng)求,1:01已經(jīng)是下一個(gè)窗口,又過來了1000個(gè)請(qǐng)求,但實(shí)際上三秒內(nèi)來了2000個(gè)請(qǐng)求,已經(jīng)超過我們的限流上限了;
滑動(dòng)窗口:還拿上面的例子,一分鐘分6份,每份10秒;每過10秒鐘,我們的時(shí)間窗口就會(huì)往右滑動(dòng)一格,每個(gè)格子都有獨(dú)立的計(jì)數(shù)器,我們每次都計(jì)算時(shí)間窗口內(nèi)的數(shù)量,可以解決計(jì)數(shù)器法中的問題,而且當(dāng)滑動(dòng)窗口的格子越多,那么限流的統(tǒng)計(jì)就會(huì)越精確。具體可以參考下圖,看圖比較清晰:
漏桶算法:這個(gè)算法也很簡(jiǎn)單,就是我們有一個(gè)固定容量的桶,有水流進(jìn)來,也有水流出去,我們不需要控制流進(jìn)來的速度,只需要控制流出去的速度,如果水流進(jìn)來的太快,桶滿了,多余的水會(huì)溢出區(qū),并不會(huì)影響水流出去的速度。
令牌桶算法:還是有一個(gè)桶,桶里面有N個(gè)令牌,所有的請(qǐng)求在處理之前都需要拿到一個(gè)可用的令牌才會(huì)被處理,如果桶里面沒有令牌的話,則拒絕服務(wù);令牌桶算法的原理是系統(tǒng)會(huì)以一個(gè)恒定的速度往桶里放入令牌。