最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java RateLimiter的限流詳解

 更新時間:2022年03月28日 10:58:43   作者:溫娉哲  
這篇文章主要為大家詳細(xì)介紹了Java RateLimiter的限流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

限流背景

在早期的計算機(jī)領(lǐng)域,限流技術(shù)(time limiting)被用做控制網(wǎng)絡(luò)接口收發(fā)通信數(shù)據(jù)的速率。可以用來優(yōu)化性能,減少延遲和提高帶寬等?,F(xiàn)在在互聯(lián)網(wǎng)領(lǐng)域,也借鑒了這個概念,用來為服務(wù)控制請求的速率,如雙十一的限流,12306的搶票等。即使在細(xì)粒度的軟件架構(gòu)中,也有類似的概念。

系統(tǒng)在使用下游資源時,需要考慮下游對資源受限,處理能力,在下游資源無法或者短時間內(nèi)無法提升處理性能的情況下,可以使用限流器或者類似保護(hù)機(jī)制,避免下游服務(wù)崩潰造成整體服務(wù)的不可用。

限流相關(guān)概念

在介紹限流之前先介紹幾個容易混淆的概念,包括服務(wù)熔斷,服務(wù)降級,服務(wù)隔離。

服務(wù)熔斷

理解熔斷之前先了解另一個概念:微服務(wù)的雪崩效應(yīng)。因?yàn)槿蹟鄼C(jī)制通常是作為應(yīng)對雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制。

在微服務(wù)架構(gòu)中,一個微服務(wù)通常是完成一個單一業(yè)務(wù)功能的獨(dú)立應(yīng)用。這樣做的好處是各個業(yè)務(wù)功能之間最大可能的解耦,每個微服務(wù)可以獨(dú)立演進(jìn)。通常一個應(yīng)用可能會有很多個微服務(wù)組成,服務(wù)間通過RPC互相調(diào)用。假如有如下服務(wù)調(diào)用鏈路:

A,B依賴C去調(diào)用E,F(xiàn)。如果E服務(wù)不能正常提供服務(wù)了,C的超時重試機(jī)制將會執(zhí)行。同時新的調(diào)用不斷產(chǎn)生,會導(dǎo)致C對E服務(wù)的調(diào)用大量的積壓,產(chǎn)生大量的調(diào)用等待和重試調(diào)用,慢慢會耗盡C的資源,比如內(nèi)存或CPU,同時影響C調(diào)F,最終整個應(yīng)用不可用。本例中由于鏈路上E的故障,對微服務(wù)A,B的調(diào)用就會占用越來越多的系統(tǒng)資源,進(jìn)而引起系統(tǒng)崩潰,即所謂的“雪崩效應(yīng)”。

熔斷機(jī)制是應(yīng)對雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制,生活中有很多熔斷的例子。比如電路中某個地方的電壓過高,熔斷器就會熔斷,對電路進(jìn)行過載保護(hù)。股市里邊,如果股票指數(shù)漲跌幅過高,觸及設(shè)置的熔斷點(diǎn)后,隨后的一段時間內(nèi)將暫停交易。在微服務(wù)架構(gòu)中的熔斷機(jī)制作用類似。當(dāng)調(diào)用鏈路的某個微服務(wù)不可用,或者響應(yīng)時間太長,或者錯誤次數(shù)達(dá)到某個閾值,會進(jìn)行服務(wù)熔斷,即快速返回響應(yīng)信息。當(dāng)檢測到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后,逐步恢復(fù)正常的調(diào)用鏈路。

服務(wù)降級

服務(wù)降級主要是指在服務(wù)器壓力陡增的情況下,根據(jù)某種策略對一些非核心服務(wù)或者頁面不做請求處理或者簡單處理,或者限流某個服務(wù),從而釋放服務(wù)器資源以保證核心業(yè)務(wù)正常運(yùn)作或高效運(yùn)作。比如京東618活動時,把無關(guān)交易的服務(wù)降級,比如關(guān)閉某個服務(wù),或者查看歷史訂單,商品歷史評論等非交易核心業(yè)務(wù),只顯示最近100條等。

服務(wù)隔離

隔離是指服務(wù)或者資源隔離開。服務(wù)隔離能夠在服務(wù)發(fā)生故障時限定其影響范圍,保證其他服務(wù)還是可用的。資源隔離一般是指通過隔離來減少服務(wù)間資源競爭。資源隔離的粒度有很多種,比如線程隔離,進(jìn)程隔離,機(jī)房隔離等。線程隔離即隔離線程池資源,不同服務(wù)的執(zhí)行使用不同的線程池。這樣做的好處是即使其中一個服務(wù)線程池滿了,也不會影響到其他的服務(wù)。比如下圖中Tomcat處理請求,對每個微服務(wù),都分配一個線程池。

服務(wù)限流

服務(wù)限流是限制請求的數(shù)量,即某個時間窗口內(nèi)的請求速率。一旦達(dá)到限制速率則可以拒絕服務(wù)(定向到錯誤頁或告知系統(tǒng)忙),排隊等待(比如秒殺,用戶評論,下單),降級(返回兜底數(shù)據(jù)或默認(rèn)數(shù)據(jù))。

比較

服務(wù)熔斷,服務(wù)降級都是從系統(tǒng)的可用性角度考慮,防止系統(tǒng)響應(yīng)延遲甚至崩潰而采用的技術(shù)性的系統(tǒng)保護(hù)手段。服務(wù)熔斷一般是由某個下游服務(wù)故障引起,而服務(wù)降級一般是從整體業(yè)務(wù)的負(fù)載情況考慮,目的是為了降低系統(tǒng)負(fù)載。限流則是對單位時間內(nèi)請求次數(shù)的限制。三者都是通過某種手段保證流量過載時系統(tǒng)的可用性。服務(wù)隔離則是讓不同的業(yè)務(wù)使用各自獨(dú)立的線程池資源,避免服務(wù)之間資源競爭的影響。

常見的限流方法

常見的限流手段有如下這些。限制總的并發(fā)數(shù)(比如數(shù)據(jù)庫連接池,線程池),限制瞬時并發(fā)數(shù)(如nginx的limit_conn模塊,用來限制瞬時并發(fā)連接數(shù)),限制某個時間窗口內(nèi)的平均速率(RateLimiter,nginx的limit_req模塊);此外還有限制RPC調(diào)用頻率,限制MQ的消費(fèi)速率等。

限流工具類RateLimiter

google開源工具包guava提供了限流工具類RateLimiter,該類基于“令牌桶算法”,非常方便使用。

RateLimiter 使用Demo:

import com.google.common.util.concurrent.RateLimiter;
public class RateLimiterDemo {
    public static void main(String[] args) {
//        testNoRateLimiter();
        testWithRateLimiter();
    }
    public static void testNoRateLimiter() {
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            System.out.println("call execute.." + i);
        }
        Long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
    public static void testWithRateLimiter() {
        Long start = System.currentTimeMillis();
        RateLimiter limiter = RateLimiter.create(10.0); // 每秒不超過10個任務(wù)被提交
        for (int i = 0; i < 20; i++) {
            limiter.acquire(); // 請求RateLimiter, 超過permits會被阻塞
            System.out.println("call execute.." + i);
        }
        Long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

Guava版本

<dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>18.0</version>
</dependency>

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

最新評論

桃园市| 蕲春县| 合江县| 家居| 抚宁县| 满城县| 资源县| 临潭县| 烟台市| 镇雄县| 邢台市| 濉溪县| 铅山县| 罗甸县| 武夷山市| 个旧市| 青州市| 平陆县| 中牟县| 荔波县| 平和县| 娱乐| 南澳县| 荥经县| 郯城县| 赫章县| 甘洛县| 曲沃县| 清河县| 信宜市| 湖北省| 闽清县| 富宁县| 鲜城| 西华县| 合肥市| 行唐县| 通渭县| 盐亭县| 文化| 阜新市|