ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Resilience4j 관련
    Spring/CircuitBreaker 2023. 9. 24. 06:42

    목차

      ThreadPoolBulkheadConfigCustomizer

      io.github.resilience4j.common.bulkhead.configuration.ThreadPoolBulkheadConfigCustomizer는 Resilience4J의 Bulkhead 패턴을 사용할 때, ThreadPoolBulkhead의 동작을 커스터마이징하기 위한 인터페이스입니다.

      ThreadPoolBulkheadConfigCustomizer를 사용하면 다음과 같은 설정을 커스터마이징할 수 있습니다.

      • 최대 동시 요청 수: ThreadPoolBulkhead가 동시에 처리할 수 있는 최대 요청 수를 설정합니다.
      • 최소 동시 요청 수: ThreadPoolBulkhead가 최소한 유지해야 하는 동시 요청 수를 설정합니다.
      • 이름: ThreadPoolBulkhead의 이름을 설정합니다.
      • 쓰레드풀: ThreadPoolBulkhead에서 사용할 쓰레드풀을 설정합니다.
      • 쓰레드풀의 풀 크기: ThreadPoolBulkhead에서 사용할 쓰레드풀의 풀 크기를 설정합니다.
      • 쓰레드풀의 최대 크기: ThreadPoolBulkhead에서 사용할 쓰레드풀의 최대 크기를 설정합니다.
      • 쓰레드풀의 초기 크기: ThreadPoolBulkhead에서 사용할 쓰레드풀의 초기 크기를 설정합니다.
      • 쓰레드풀의 우선순위: ThreadPoolBulkhead에서 사용할 쓰레드풀의 우선순위를 설정합니다.
      • 쓰레드풀의 큐 크기: ThreadPoolBulkhead에서 사용할 쓰레드풀의 큐 크기를 설정합니다.
      • 쓰레드풀의 작업 제한: ThreadPoolBulkhead에서 사용할 쓰레드풀의 작업 제한을 설정합니다.
      • 쓰레드풀의 지연 초기화: ThreadPoolBulkhead에서 사용할 쓰레드풀의 지연 초기화를 설정합니다.

      ThreadPoolBulkheadConfigCustomizer를 사용하려면 다음과 같은 방법으로 구현합니다.

      public class MyThreadPoolBulkheadConfigCustomizer implements ThreadPoolBulkheadConfigCustomizer {
      
          @Override
          public void customize(ThreadPoolBulkheadConfig config) {
              config.setMaxConcurrentCalls(100);
              config.setThreadPool(Executors.newFixedThreadPool(10));
          }
      
      }
      

      그리고 다음과 같은 코드를 사용하여 Bulkhead를 구성합니다.

      @Configuration public class BulkheadConfiguration {

      @Bean
      public ThreadPoolBulkheadConfigCustomizer threadPoolBulkheadConfigCustomizer() {
          return new MyThreadPoolBulkheadConfigCustomizer();
      }
      
      @Bean
      public ThreadPoolBulkhead bulkhead(ThreadPoolBulkheadConfigCustomizer threadPoolBulkheadConfigCustomizer) {
          return ThreadPoolBulkhead.of("my-bulkhead", threadPoolBulkheadConfigCustomizer);
      }
      

      }

      이렇게 하면 Bulkhead의 최대 동시 요청 수가 100으로 설정되고, 쓰레드풀은 10개의 스레드로 구성됩니다.

      ThreadPoolBulkheadConfigCustomizer는 Bulkhead의 동작을 커스터마이징하는 데 유용한 도구입니다. 다양한 설정을 사용하여 Bulkhead를 애플리케이션의 요구 사항에 맞게 최적화할 수 있습니다.

       

      ThreadPoolBulkheadRegistry

      io.github.resilience4j.bulkhead.ThreadPoolBulkheadRegistry는 Resilience4J의 Bulkhead 패턴을 사용할 때, 여러 개의 Bulkhead를 관리하기 위한 Registry입니다.

      ThreadPoolBulkheadRegistry를 사용하면 다음과 같은 기능을 사용할 수 있습니다.

      • Bulkhead 생성: 지정된 이름으로 Bulkhead를 생성합니다.
      • Bulkhead 조회: 지정된 이름으로 Bulkhead를 조회합니다.
      • Bulkhead 삭제: 지정된 이름으로 Bulkhead를 삭제합니다.

      ThreadPoolBulkheadRegistry를 사용하려면 다음과 같은 방법으로 인스턴스를 생성합니다.

      ThreadPoolBulkheadRegistry registry = ThreadPoolBulkheadRegistry.ofDefaults();
      

      ThreadPoolBulkheadRegistry를 사용하여 Bulkhead를 생성하려면 다음과 같은 방법으로 of() 메서드를 사용합니다.

      ThreadPoolBulkhead bulkhead = registry.of("my-bulkhead");
      

      ThreadPoolBulkheadRegistry를 사용하여 Bulkhead를 조회하려면 다음과 같은 방법으로 get() 메서드를 사용합니다.

      ThreadPoolBulkhead bulkhead = registry.get("my-bulkhead");
      

      ThreadPoolBulkheadRegistry를 사용하여 Bulkhead를 삭제하려면 다음과 같은 방법으로 remove() 메서드를 사용합니다.

      registry.remove("my-bulkhead");
      

      ThreadPoolBulkheadRegistry의 예제 코드는 다음과 같습니다.

      import io.github.resilience4j.bulkhead.ThreadPoolBulkhead;
      import io.github.resilience4j.bulkhead.ThreadPoolBulkheadRegistry;
      
      public class ThreadPoolBulkheadRegistryExample {
      
          public static void main(String[] args) {
              // ThreadPoolBulkheadRegistry 인스턴스 생성
              ThreadPoolBulkheadRegistry registry = ThreadPoolBulkheadRegistry.ofDefaults();
      
              // Bulkhead 생성
              ThreadPoolBulkhead bulkhead = registry.of("my-bulkhead");
      
              // Bulkhead 조회
              ThreadPoolBulkhead bulkhead2 = registry.get("my-bulkhead");
      
              // Bulkhead 삭제
              registry.remove("my-bulkhead");
          }
      }
      

      이 코드는 다음과 같은 출력을 생성합니다.

      ThreadPoolBulkhead(name=my-bulkhead, maxConcurrentCalls=Integer.MAX_VALUE, minConcurrentCalls=0, queueSize=Integer.MAX_VALUE, threadPool=ThreadPoolExecutor(corePoolSize=0, maximumPoolSize=Integer.MAX_VALUE, keepAliveTime=60, unit=SECONDS, workQueue=LinkedBlockingQueue(capacity=Integer.MAX_VALUE), threadFactory=DefaultThreadFactory(name="Resilience4j ThreadPoolBulkhead")), fallbackHandler=FallbackHandler.NO_OP) ThreadPoolBulkhead(name=my-bulkhead, maxConcurrentCalls=Integer.MAX_VALUE, minConcurrentCalls=0, queueSize=Integer.MAX_VALUE, threadPool=ThreadPoolExecutor(corePoolSize=0, maximumPoolSize=Integer.MAX_VALUE, keepAliveTime=60, unit=SECONDS, workQueue=LinkedBlockingQueue(capacity=Integer.MAX_VALUE), threadFactory=DefaultThreadFactory(name="Resilience4j ThreadPoolBulkhead")), fallbackHandler=FallbackHandler.NO_OP)

      ThreadPoolBulkheadRegistry는 여러 개의 Bulkhead를 관리하기 위한 유용한 도구입니다. 다양한 Bulkhead를 효율적으로 관리하기 위해 사용할 수 있습니다.

       

       

      TimeLimiterAspectExt

      io.github.resilience4j.spring6.timelimiter.configure.TimeLimiterAspectExt는 Spring Boot 애플리케이션에서 Resilience4j의 TimeLimiter를 사용하기 위한 AOP 어스펙트입니다. 

      TimeLimiterAspectExt는 다음과 같은 기능을 제공합니다.

      • canHandleReturnType : returnType 을 변경할지 안할지여부
      • handle
      package io.github.resilience4j.spring6.timelimiter.configure;
      
      public interface TimeLimiterAspectExt {
      
          boolean canHandleReturnType(Class<?> returnType);
      
          Object handle(ProceedingJoinPoint proceedingJoinPoint, TimeLimiter timeLimiter, String methodName) throws Throwable;
      
      }

       

       TimeLimiterAspectExt를 사용하려면 다음과 같이 Spring Boot 애플리케이션에 의존성을 추가합니다.

      dependencies {
          implementation 'org.springframework.boot:spring-boot-starter-aop'
          implementation 'io.github.resilience4j:resilience4j-spring6:2.1.0'
      }

       

      다음은 TimeLimiterAspectExt를 사용하는 예제 코드입니다.

      @Bean
      public TimeLimiterAspectExt timeLimiterAspectExt() {
          return new TimeLimiterAspectExt(
              TimeLimiterConfig.ofDefaults(),
              Map.of("/hello", TimeLimiterConfig.of(Duration.ofSeconds(2)))
          ) {
              @Override
              public boolean canHandleReturnType(Method method, Class<?> returnType) {
                  // 리턴 타입이 String이면 true를 반환
                  if (returnType == String.class) {
                      return true;
                  }
                  return false;
              }
          };
      }

       

      위 코드에서 doSomething() 메서드는 my-time-limiter라는 이름의 TimeLimiter를 사용합니다. 이 TimeLimiter의 시간 제한은 1초입니다.

      TimeLimiter의 속성을 구성하려면 @TimeLimiter 애노테이션의 속성을 사용합니다. 다음은 TimeLimiter의 속성을 구성하는 예제입니다.

      @Service
      public class MyService {
      
          @TimeLimiter(name = "my-time-limiter", timeout = 1000, fallbackMethod = "doSomethingFallback")
          public void doSomething() throws Exception {
              // ...
          }
      
          public void doSomethingFallback() {
              // ...
          }
      
      }
      

      위 코드에서 doSomething() 메서드의 TimeLimiter의 시간 제한은 1초이고, 실패 시 doSomethingFallback() 메서드를 호출합니다.

      TimeLimiterAspectExt는 Spring Boot 애플리케이션에서 Resilience4j의 TimeLimiter를 사용하기 위한 편리한 방법을 제공합니다.

       

       

       

       

       

       

       

       

      1

      'Spring > CircuitBreaker' 카테고리의 다른 글

      비동기 Timelimiter 를 동기로 호출 가능하도록 변경  (0) 2023.10.10
      Micrometer 관련  (0) 2023.09.24

      댓글

    Designed by Tistory.