CircuitBreaker

이재철·2021년 10월 23일
0

MSA

목록 보기
10/13
  • 장애가 발생하는 서비스에 반복적인 호출이 되지 못하게 차단

  • 특정 서비스가 정상적으로 동작하지 않을 경우 다른 기능으로 대체 수행 -> 장애 회피

  • Hystrix -> Resilience4j 로 대체

Resilience4j

  • resilience4j-circuitbreaker: Circuit breaking
  • resilience4j-ratelimiter: Rate limiting
  • resilience4j-bulkhead: Bulkheading
  • resilience4j-retry: Automatic retrying (sync and async)
  • resilience4j-timelimiter: Timeout handling
  • resilience4j-cache: Result caching

간단히 사용해보기

  • pom.xml
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>
  • user-service getUserByUserId() 함수 order-service 호출하는 부분

  private final CircuitBreakerFactory circuitBreakerFactory;
  
  ...
public UserDto getUserByUserId() {
  ...
  
// 주석
//  List<ResponseOrder> orderList = orderServiceClient.getOrders(userId); 

  CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
  List<ResponseOrder> orderList = circuitBreaker.run(() -> orderServiceClient.getOrders(userId),
            throwable -> new ArrayList<>());

...
}

Custom 해보기

package com.example.userservice.config;

import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.timelimiter.TimeLimiterConfig;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
import org.springframework.cloud.client.circuitbreaker.Customizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration
public class Resilience4jConfig {
  @Bean
  public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
    CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
      .failureRateThreshold(4)
      .waitDurationInOpenState(Duration.ofMillis(1000))
      .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
      .slidingWindowSize(2)
      .build();

    TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
      .timeoutDuration(Duration.ofSeconds(4))
      .build();

    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
      .timeLimiterConfig(timeLimiterConfig)
      .circuitBreakerConfig(circuitBreakerConfig)
      .build()
    );
  }
}

0개의 댓글