激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - JAVA教程 - RateLimit-使用guava來做接口限流代碼示例

RateLimit-使用guava來做接口限流代碼示例

2021-03-24 14:33jiesa JAVA教程

這篇文章主要介紹了RateLimit-使用guava來做接口限流代碼示例,具有一定借鑒價值,需要的朋友可以參考下

本文主要研究的是ratelimit-使用guava來做接口限流的相關(guān)內(nèi)容,具體如下。

一、問題描述

  某天a君突然發(fā)現(xiàn)自己的接口請求量突然漲到之前的10倍,沒多久該接口幾乎不可使用,并引發(fā)連鎖反應(yīng)導(dǎo)致整個系統(tǒng)崩潰。如何應(yīng)對這種情況呢?生活給了我們答案:比如老式電閘都安裝了保險絲,一旦有人使用超大功率的設(shè)備,保險絲就會燒斷以保護各個電器不被強電流給燒壞。同理我們的接口也需要安裝上“保險絲”,以防止非預(yù)期的請求對系統(tǒng)壓力過大而引起的系統(tǒng)癱瘓,當(dāng)流量過大時,可以采取拒絕或者引流等機制。

二、常用的限流算法

常用的限流算法有兩種:漏桶算法和令牌桶算法。

漏桶算法思路很簡單,請求先進入到漏桶里,漏桶以一定的速度出水,當(dāng)水請求過大會直接溢出,可以看出漏桶算法能強行限制數(shù)據(jù)的傳輸速率。

RateLimit-使用guava來做接口限流代碼示例

圖1 漏桶算法示意圖

對于很多應(yīng)用場景來說,除了要求能夠限制數(shù)據(jù)的平均傳輸速率外,還要求允許某種程度的突發(fā)傳輸。這時候漏桶算法可能就不合適了,令牌桶算法更為適合。如圖2所示,令牌桶算法的原理是系統(tǒng)會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當(dāng)桶里沒有令牌可取時,則拒絕服務(wù)。

RateLimit-使用guava來做接口限流代碼示例

圖2 令牌桶算法示意圖

三、限流工具類ratelimiter

  google開源工具包guava提供了限流工具類ratelimiter,該類基于“令牌桶算法”,非常方便使用。該類的接口具體的使用請參考:ratelimiter使用實踐

ratelimiter 使用demo

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package ratelimite;
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 < 10; i++) {
            limiter.acquire();
            // 請求ratelimiter, 超過permits會被阻塞
            system.out.println("call execute.." + i);
        }
        long end = system.currenttimemillis();
        system.out.println(end - start);
    }
}

四 guava并發(fā):listenablefuture與ratelimiter示例

概念

listenablefuture顧名思義就是可以監(jiān)聽的future,它是對java原生future的擴展增強。我們知道future表示一個異步計算任務(wù),當(dāng)任務(wù)完成時可以得到計算結(jié)果。如果我們希望一旦計算完成就拿到結(jié)果展示給用戶或者做另外的計算,就必須使用另一個線程不斷的查詢計算狀態(tài)。這樣做,代碼復(fù)雜,而且效率低下。使用listenablefuture guava幫我們檢測future是否完成了,如果完成就自動調(diào)用回調(diào)函數(shù),這樣可以減少并發(fā)程序的復(fù)雜度。

推薦使用第二種方法,因為第二種方法可以直接得到future的返回值,或者處理錯誤情況。本質(zhì)上第二種方法是通過調(diào)動第一種方法實現(xiàn)的,做了進一步的封裝。

另外listenablefuture還有其他幾種內(nèi)置實現(xiàn):

settablefuture:不需要實現(xiàn)一個方法來計算返回值,而只需要返回一個固定值來做為返回值,可以通過程序設(shè)置此future的返回值或者異常信息

checkedfuture: 這是一個繼承自listenablefuture接口,他提供了checkedget()方法,此方法在future執(zhí)行發(fā)生異常時,可以拋出指定類型的異常。

ratelimiter類似于jdk的信號量semphore,他用來限制對資源并發(fā)訪問的線程數(shù),本文介紹ratelimiter使用

代碼示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import java.util.concurrent.callable;
import java.util.concurrent.executionexception;
import java.util.concurrent.executors;
import java.util.concurrent.timeunit;
import com.google.common.util.concurrent.futurecallback;
import com.google.common.util.concurrent.futures;
import com.google.common.util.concurrent.listenablefuture;
import com.google.common.util.concurrent.listeningexecutorservice;
import com.google.common.util.concurrent.moreexecutors;
import com.google.common.util.concurrent.ratelimiter;
public class listenablefuturedemo {
    public static void main(string[] args) {
        testratelimiter();
        testlistenablefuture();
    }
    /**
   * ratelimiter類似于jdk的信號量semphore,他用來限制對資源并發(fā)訪問的線程數(shù)
   */
    public static void testratelimiter() {
        listeningexecutorservice executorservice = moreexecutors
                .listeningdecorator(executors.newcachedthreadpool());
        ratelimiter limiter = ratelimiter.create(5.0);
        // 每秒不超過4個任務(wù)被提交
        for (int i = 0; i < 10; i++) {
            limiter.acquire();
            // 請求ratelimiter, 超過permits會被阻塞
            final listenablefuture<integer> listenablefuture = executorservice
                      .submit(new task("is "+ i));
        }
    }
    public static void testlistenablefuture() {
        listeningexecutorservice executorservice = moreexecutors
                .listeningdecorator(executors.newcachedthreadpool());
        final listenablefuture<integer> listenablefuture = executorservice
                .submit(new task("testlistenablefuture"));
        //同步獲取調(diào)用結(jié)果
        try {
            system.out.println(listenablefuture.get());
        }
        catch (interruptedexception e1) {
            e1.printstacktrace();
        }
        catch (executionexception e1) {
            e1.printstacktrace();
        }
        //第一種方式
        listenablefuture.addlistener(new runnable() {
            @override
                  public void run() {
                try {
                    system.out.println("get listenable future's result "
                                  + listenablefuture.get());
                }
                catch (interruptedexception e) {
                    e.printstacktrace();
                }
                catch (executionexception e) {
                    e.printstacktrace();
                }
            }
        }
        , executorservice);
        //第二種方式
        futures.addcallback(listenablefuture, new futurecallback<integer>() {
            @override
                  public void onsuccess(integer result) {
                system.out
                            .println("get listenable future's result with callback "
                                + result);
            }
            @override
                  public void onfailure(throwable t) {
                t.printstacktrace();
            }
        }
        );
    }
}
class task implements callable<integer> {
    string str;
    public task(string str){
        this.str = str;
    }
    @override
      public integer call() throws exception {
        system.out.println("call execute.." + str);
        timeunit.seconds.sleep(1);
        return 7;
    }
}

guava版本

?
1
2
3
4
5
<dependency>
      <groupid>com.google.guava</groupid>
      <artifactid>guava</artifactid>
      <version>14.0.1</version>
    </dependency>

總結(jié)

以上就是本文關(guān)于ratelimit-使用guava來做接口限流代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/JIESA/article/details/50412027

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久久电影网站 | 国产精品99久久久久久大便 | 黄色网www | 草莓福利社区在线 | 奶子吧naiziba.cc免费午夜片在线观看 | 午夜精品在线视频 | 在线观看国产免费视频 | av电影院在线观看 | 黄a大片 | 国产午夜精品久久久久久免费视 | 99精美视频 | 一区二区免费网站 | 在线播放免费av | av免费在线播放网址 | 国产精品欧美久久久久一区二区 | 国产无遮挡一区二区三区毛片日本 | 国产成人视屏 | 国产精品区一区二区三区 | 午夜精品福利在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 国产精品免费视频观看 | 日韩精品久久一区二区三区 | 日韩一级片一区二区三区 | 国产日韩在线观看视频 | 91久久久久久久久久久久久久 | 亚洲天堂成人在线 | 一级免费在线 | 欧产日产国产精品乱噜噜 | 国产老师做www爽爽爽视频 | 久久99国产伦子精品免费 | chinesexxxx极品少妇 | 一区二区三区精品国产 | 中文字幕欧美一区二区三区 | 亚州精品天堂中文字幕 | 一级成人毛片 | 久久日本 | 久草免费新视频 | 亚洲精品久久久久久久久久久 | 特级黄aaaaaaaaa毛片 | 韩国一级免费视频 | 国产日韩在线观看一区 |