-
Notifications
You must be signed in to change notification settings - Fork 0
Spring Cloud Circuit Breaker
Jordan(정명주) edited this page Dec 23, 2023
·
6 revisions
- Release It 에서 처음 소개된 패턴
- 원격 서비스 호출 시 서비스 장애가 전파되는 것을 방지하는 패턴
- Cloud, MSA 환경에서 필수 패턴 중 하나
- Close: 회로차단기가 닫혀 있으니까 통신이 잘되는 상태.
- Open: 연결하는 서버의 통신이 계속 실패하니 아예 통신을 시도하지 않고 바로 실패(or Fallback)하는 상태. fail-fast
- Half-Open: 통신이 가능한지 시도해 보는 상태. Open 상태에서 주기적으로 Half-Open 상태로 바뀜. 여기에서 통신이 성공 상태로 판단되면 Close 상태로 바뀜.
현재는 resilience4j 구현체를 가장 많이 사용하고 있음
좋은 읽을거리
implementation("org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j")
- spring boot Config 예시 (open-feign과 조합)
resilience4j:
circuitbreaker: # https://resilience4j.readme.io/docs/circuitbreaker#create-and-configure-a-circuitbreaker
configs:
default:
sliding-window-type: time_based # 시간 기반 윈도우 슬라이드 설정(default: count_based)
sliding-window-size: 30 # 한 슬라이드 단위는 30초(default:100)
minimum-number-of-calls: 10 # 최소 호출 개수. 이 이상 호출되어야지 오류 여부를 판단할 수 있다. (default: 100)
slow-call-rate-threshold: 75 # slow-call 비율 임계치(%).(default: 100) slow-call이 이 임계치를 넘어가면 OPEN 된다.
slow-call-duration-threshold: 6s # slow-call 로 판단하는 대기시간 임계치
wait-duration-in-open-state: 15s # OPEN -> HALF_OPEN 으로 전환되기 전에 대기시간 (default: 60s)
permitted-number-of-calls-in-half-open-state: # HALF_OPEN 시 허용되는 호출 수 (default: 10)
ignore-exceptions: # 해당 예외는 장애로 판단하지 않음.(애플리케이션 내에서 400 계열로 발생할 수 있는 상황)
- com.sample.exception.InternalApiClientException
kakao:
base-config: default
naver:
base-config: default
slow-call-duration-threshold: 8s
instances:
default:
base-config: default
timelimiter:
configs:
default:
timeout-duration: 9s # slowCallDurationThreshold보다는 크게 설정되어야 함. 그리고 feign read-timeout 보다 짧아야함
cancel-running-future: true
naver:
base-config: default
timeout-duration: 11s
kakao:
base-config: default
timeout-duration: 11s
spring:
cloud:
circuitbreaker:
resilience4j:
disable-time-limiter: true # spring-boot 3.1.x 에서 사용 예정
openfeign:
circuitbreaker:
enabled: true
group:
enabled: true # 그룹 별로 관리.(모든 메서드에 대해서 관리힘들어서 개인적으로 선호함 특히 openfeign 통합 시)
client:
config:
default:
logger-level: basic
connect-timeout: 2000
read-timeout: 8000
naver:
url: ${application.naver-open-api.origin} # 따로 정의해 둠
kakao:
url: ${application.kakao-open-api.origin} # 따로 정의해 둠
read-timeout: 10000
compression:
request:
enabled: true
response:
enabled: true
httpclient:
hc5: # hc5가 좋은 것 같음. ok-http의 경우에는 네이티브 자원 사용하는지라 장애 요소가 있음.
enabled: true
pool-reuse-policy: fifo
pool-concurrency-policy: strict
JAVA
JPA
- JPA-Create-And-Update
- Optional-Eager
- QueryDsl-Configuration
- QueryDsl-More-Type-safety
- QueryDsl-SubQuery
DDD
Install
Spring
Spring-Boot
- Swagger2-Configuration
- Spring-Restdocs-Configuration
- Spring-Page-Jackson
- JSR310-Guide
- logback-spring.xml
- WebMvcUtils.java
- Spring-Boot-Properties
- Spring-Boot-Hidden-Gems
- Spring-Boot-Config
Spring-Cloud
- Spring-Cloud-Zuul
- Spring-Cloud-Feign
- Spring-Cloud-Hystrix
- Spring-Cloud-Consul
- Spring-Cloud-Ribbon
- Spring-Cloud-Circuit-Breaker
JavaScript
Gradle
Test
Linux
Etc
TODO http://zoltanaltfatter.com/2017/06/09/publishing-domain-events-from-aggregate-roots/