-
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