이 기사는 주로 Ratelimit- Guava를 사용하여 인터페이스 흐름 제한을 수행하는 관련 내용을 다음과 같이 연구합니다.
1. 문제 설명
어느 날, A 씨는 갑자기 인터페이스에 대한 요청 수가 갑자기 이전의 인터페이스 요청의 10 배로 증가한 것을 발견했습니다. 얼마 지나지 않아 인터페이스는 거의 사용할 수 없었고 전체 시스템이 붕괴 된 연쇄 반응을 일으켰습니다. 이 상황을 다루는 방법? 인생은 우리에게 답을줍니다. 예를 들어, 구식 스위치에는 퓨즈가 장착되어 있습니다. 누군가가 초 고출력 장비를 사용하면 퓨즈를 날려 각 기기가 강한 전류로 태워지는 것을 방지합니다. 마찬가지로, 우리의 인터페이스는 또한 예상치 못한 요청에 의해 시스템에 대한 과도한 압력으로 인한 시스템 마비를 방지하기 위해 "퓨즈"와 함께 설치해야합니다. 트래픽이 너무 커지면 거부 또는 배수와 같은 메커니즘을 채택 할 수 있습니다.
2. 일반적으로 현재 사용되는 전류 제한 알고리즘
일반적으로 사용되는 두 가지 현재 제한 알고리즘의 두 가지가 있습니다 : Leaky Bucket Algorithm 및 Token Bucket Algorithm.
누출 된 버킷 알고리즘에 대한 아이디어는 매우 간단합니다. 누출 된 버킷을 먼저 입력하십시오. 새는 버킷은 특정 속도로 나옵니다. 물 요청이 너무 커지면 직접 오버플로됩니다. 누출 된 버킷 알고리즘은 데이터 전송 속도를 강제로 제한 할 수 있음을 알 수 있습니다.
그림 1 누출 된 버킷 알고리즘의 개략도
많은 응용 프로그램 시나리오의 경우 평균 데이터의 데이터 전송 속도를 제한 할 수있을뿐만 아니라 어느 정도의 버스트 전송을 허용해야합니다. 현재 누출 된 버킷 알고리즘이 적합하지 않을 수 있으며 토큰 버킷 알고리즘이 더 적합합니다. 도 2에 도시 된 바와 같이, 토큰 버킷 알고리즘의 원리는 시스템이 일정한 속도로 버킷에 토큰을 넣는다는 것이다. 요청을 처리 해야하는 경우 먼저 버킷에서 토큰을 얻어야합니다. 버킷에 토큰이 없으면 서비스가 거부됩니다.
그림 2 토큰 버킷 알고리즘의 개략도
3. 현재 제한 도구 클래스에서의 래트 림터
Google의 오픈 소스 툴킷 Guava는 "토큰 버킷 알고리즘"을 기반으로하는 Ratelimiter 클래스를 제공하며 사용하기에 매우 편리합니다. 이 클래스 인터페이스의 구체적인 사용은 ratelimiter 사용법 관행을 참조하십시오.
데모를 사용한 ratelimiter
패키지 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. <10; i ++ {System.out.println ( "콜 execute .."+i);} system.out.println (End -Start);} public static void testwithratelimiter () {long start.currenttimillis (); 초당 10 개의 작업이 (int i = 0; i <10; i ++) {limiter.acquire (); // Ratelimiter 요청을 초과하는 허가를 초과하는 허가를 초과합니다. 4 개의 Guava 동시성 : ListenableFuture 및 Ratelimiter 예제
개념
ListenableFuture는 이름에서 알 수 있듯이들을 수있는 미래이며 Java 원주민 미래에 대한 확장 된 향상입니다. 우리는 미래가 비동기 계산 작업을 나타내고, 작업이 완료되면 계산 결과를 얻을 수 있습니다. 계산이 완료되거나 다른 계산을 수행하면 결과를 가져 와서 사용자에게 표시하려면 다른 스레드를 사용하여 계산 상태를 지속적으로 쿼리해야합니다. 이것은 코드를 복잡하고 비효율적으로 만듭니다. ListenableFuture Guava를 사용하여 미래가 완료되었는지 여부를 감지하는 데 도움이됩니다. 완료되면 콜백 함수가 자동으로 호출되어 동시 프로그램의 복잡성을 줄일 수 있습니다.
두 번째 방법은 두 번째 방법이 향후의 반환 값을 직접 얻거나 손잡이 오류를 얻을 수 있으므로 두 번째 방법이 권장됩니다. 본질적으로, 두 번째 방법은 첫 번째 방법을 동원함으로써 달성되며 추가 캡슐화가 수행된다.
또한 ListenableFuture에는 몇 가지 다른 내장 구현이 있습니다.
SettableFuture : 반환 값을 계산하는 방법을 구현할 필요는 없지만 반환 값으로 반환하려면 고정 값 만 필요합니다. 프로그램을 통해이 미래의 반환 값 또는 예외 정보를 설정할 수 있습니다.
Checkedfuture : 이것은 ListenableFuture 인터페이스에서 상속됩니다. CheckEdget () 메소드를 제공합니다. 이 방법은 향후 실행에서 예외가 발생할 때 지정된 유형을 제외 할 수 있습니다.
Ratelimiter는 JDK의 세마포어와 유사합니다. 자원에 동시에 액세스 할 스레드 수를 제한하는 데 사용됩니다. 이 기사는 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.listenecutorservice; import com.google.common.util.concutent.morexecutors; 수입 com.google.common.util.concurrent.ratelimiter; public class listenablefuturedemo {public static void main (string [] args) {testratelimiter (); testListenableFuture ();}/*** Ratelimiter는 JDK 학기 Semphore와 유사합니다. TestRatelimiter () {ListenExeCutorserVice executorService = moreExecutors .listeningEdecorator (executors.newCachedThreadpool ()); ratelimiter limiter = ratelimiter.create (5.0); // 4 이상의 작업이 (int i = 0; i ++) {I ++) {I ++) {I ++) {I ++) {I ++); ratelimiter, 초과 허가는 최종 청취 가능한 후원 <integer> listenablefuture = executorService .Submit ( "is"+ i));}} public static void testListenableFuture () {ListenEcutorService executorService = more ExecuTeNeDecorator (executors.n); 최종 ListenableFuture <integer> listenableFuture = executorService .Submit (새로운 작업 ( "testListenableFuture")); // 호출 결과를 동기식으로 얻습니다. {system.out.println (listenableFuture.get ());} catch (InterruptedExcection e1) {e1.printstacktractrace (); {e1.printstacktrace ();} // 첫 번째 방식으로 listenablefuture.addlistener (new Runnable () {@override public void run () {try {system.out.println ( "듣기 가능한 미래의 결과" + ListableFuture.get ()) {e.printedectece e)}}}} executorService); // 두 번째 웨이 futures.addcallback (ListenableFuture, 새로운 futurecallback <integer> () {@override public void onsuccess (Integer result) {system.out .println ( "콜백" + 결과를받을 수있는 미래 받기 "}@reveride public void onfailure (strash table t). {t.printstacktrace ();}});}} 클래스 작업은 호출 가능 <integer> {string str; public task (string str) {this.str = str;}@public integer call () 예외 {system.out.println ( "call execute .." + str.구아바 버전
<pectionency> <groupid> com.google.guava </groupid> <artifactid> guava </artifactid> <bersion> 14.0.1 </version> </fectionency>
요약
위의 것은 Ratelimit에 관한 것입니다 - Guava를 사용하여 인터페이스 전류 제한 코드 예제를 만듭니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!