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

RateLimit-使用guava來(lái)做接口限流代碼示例

 更新時(shí)間:2018年01月19日 10:12:33   作者:jiesa  
這篇文章主要介紹了RateLimit-使用guava來(lái)做接口限流代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下

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

一、問(wèn)題描述

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

二、常用的限流算法

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

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

圖1 漏桶算法示意圖

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

圖2 令牌桶算法示意圖

三、限流工具類RateLimiter

  google開(kāi)源工具包guava提供了限流工具類RateLimiter,該類基于“令牌桶算法”,非常方便使用。該類的接口具體的使用請(qǐng)參考:RateLimiter使用實(shí)踐

RateLimiter 使用Demo

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);
		// 每秒不超過(guò)10個(gè)任務(wù)被提交 
		for (int i = 0; i < 10; i++) {
			limiter.acquire();
			// 請(qǐng)求RateLimiter, 超過(guò)permits會(huì)被阻塞 
			System.out.println("call execute.." + i);
		}
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}
}

四 Guava并發(fā):ListenableFuture與RateLimiter示例

概念

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

推薦使用第二種方法,因?yàn)榈诙N方法可以直接得到Future的返回值,或者處理錯(cuò)誤情況。本質(zhì)上第二種方法是通過(guò)調(diào)動(dòng)第一種方法實(shí)現(xiàn)的,做了進(jìn)一步的封裝。

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

SettableFuture:不需要實(shí)現(xiàn)一個(gè)方法來(lái)計(jì)算返回值,而只需要返回一個(gè)固定值來(lái)做為返回值,可以通過(guò)程序設(shè)置此Future的返回值或者異常信息

CheckedFuture: 這是一個(gè)繼承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future執(zhí)行發(fā)生異常時(shí),可以拋出指定類型的異常。

RateLimiter類似于JDK的信號(hào)量Semphore,他用來(lái)限制對(duì)資源并發(fā)訪問(wèn)的線程數(shù),本文介紹RateLimiter使用

代碼示例

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的信號(hào)量Semphore,他用來(lái)限制對(duì)資源并發(fā)訪問(wèn)的線程數(shù)
   */
	public static void testRateLimiter() {
		ListeningExecutorService executorService = MoreExecutors
		        .listeningDecorator(Executors.newCachedThreadPool());
		RateLimiter limiter = RateLimiter.create(5.0);
		// 每秒不超過(guò)4個(gè)任務(wù)被提交
		for (int i = 0; i < 10; i++) {
			limiter.acquire();
			// 請(qǐng)求RateLimiter, 超過(guò)permits會(huì)被阻塞
			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版本

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

總結(jié)

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

相關(guān)文章

  • Spring Boot Admin微服務(wù)應(yīng)用監(jiān)控的實(shí)現(xiàn)

    Spring Boot Admin微服務(wù)應(yīng)用監(jiān)控的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot Admin微服務(wù)應(yīng)用監(jiān)控,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • IDEA設(shè)置maven修改settings.xml配置文件無(wú)法加載倉(cāng)庫(kù)的解決方案

    IDEA設(shè)置maven修改settings.xml配置文件無(wú)法加載倉(cāng)庫(kù)的解決方案

    這篇文章主要介紹了IDEA設(shè)置maven修改settings.xml配置文件無(wú)法加載倉(cāng)庫(kù)的解決方案,幫助大家更好的利用IDEA進(jìn)行JAVA的開(kāi)發(fā)學(xué)習(xí),感興趣的朋友可以了解下
    2021-01-01
  • springboot 接口返回字符串帶引號(hào)的問(wèn)題解決

    springboot 接口返回字符串帶引號(hào)的問(wèn)題解決

    本文主要介紹了springboot 接口返回字符串帶引號(hào)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java實(shí)現(xiàn)全局監(jiān)聽(tīng)鍵盤(pán)詳解

    java實(shí)現(xiàn)全局監(jiān)聽(tīng)鍵盤(pán)詳解

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)全局監(jiān)聽(tīng)鍵盤(pán)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2024-01-01
  • SpringMVC中Json數(shù)據(jù)格式轉(zhuǎn)換

    SpringMVC中Json數(shù)據(jù)格式轉(zhuǎn)換

    本文主要介紹了SpringMVC中Json數(shù)據(jù)格式轉(zhuǎn)換的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 學(xué)習(xí)Java之如何正確地向上轉(zhuǎn)型與向下轉(zhuǎn)型

    學(xué)習(xí)Java之如何正確地向上轉(zhuǎn)型與向下轉(zhuǎn)型

    面向?qū)ο蟮牡谌齻€(gè)特征是多態(tài),實(shí)現(xiàn)多態(tài)有三個(gè)必要條件:繼承、方法重寫(xiě)和向上轉(zhuǎn)型,在學(xué)習(xí)多態(tài)之前,我們還要先學(xué)習(xí)Java的類型轉(zhuǎn)換,本篇文章就來(lái)帶大家認(rèn)識(shí)什么是類型轉(zhuǎn)換,看看類型轉(zhuǎn)換都有哪幾種情況,以及如何避免類型轉(zhuǎn)換時(shí)出現(xiàn)異常
    2023-05-05
  • Java使用POI生成Word文檔簡(jiǎn)單代碼示例

    Java使用POI生成Word文檔簡(jiǎn)單代碼示例

    Java?POI是一個(gè)用于操作Microsoft?Office格式文件的Java庫(kù),包括?Word、Excel和PowerPoint等文件,這篇文章主要給大家介紹了關(guān)于Java使用POI生成Word文檔的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 基于Spring depends-on的使用詳解

    基于Spring depends-on的使用詳解

    這篇文章主要介紹了Spring depends-on的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 全面解析Java main方法

    全面解析Java main方法

    main方法是我們學(xué)習(xí)Java語(yǔ)言學(xué)習(xí)的第一個(gè)方法,也是每個(gè)java使用者最熟悉的方法,每個(gè)Java應(yīng)用程序都必須有且僅有一個(gè)main方法。這篇文章通過(guò)實(shí)例代碼給大家介紹java main方法的相關(guān)知識(shí),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • ArrayList在for循環(huán)中使用remove方法移除元素方法介紹

    ArrayList在for循環(huán)中使用remove方法移除元素方法介紹

    這篇文章主要介紹了ArrayList在for循環(huán)中使用remove方法移除元素的內(nèi)容,介紹了具體代碼實(shí)現(xiàn),需要的朋友可以參考下。
    2017-09-09

最新評(píng)論

华池县| 密云县| 宜城市| 溆浦县| 波密县| 安泽县| 额尔古纳市| 涟水县| 江源县| 富裕县| 延寿县| 喜德县| 庄浪县| 息烽县| 峨山| 崇文区| 同德县| 宜兴市| 东港市| 汾阳市| 晋州市| 马龙县| 神农架林区| 江津市| 临泽县| 通城县| 东光县| 晋城| 石嘴山市| 兴海县| 汉川市| 图片| 剑川县| 天全县| 永嘉县| 富民县| 凤冈县| 邳州市| 台江县| 台山市| 湘西|