spring cloud CircuitBreaker는 Resilience4J와 Spring Retry의 구현체를 포함한다.
(자바 서킷 브레이커의 라이브러리가 Reslience4J인 것)
Circuit Breaker 패턴은 특히 MSA 환경의 필수 패턴 중 하나이다.
백엔드에서 개발을 할 때 외부 API를 호출해야하는 경우가 있다.(특히 MSA 환경)
문제는 서버들에 장애가 발생했을 때 이다. 호출한 다른 서비스에 장애가 발생한다면, 장애가 전파되어 장애가 발생하지 않은 서비스까지 문제가 발생할 수 있다. 또한 장애가 발생한 서버에 계속해서 요청을 보내는 것 또한 장애 복구를 어렵게 한다.
따라서 장애가 발생한 서비스를 탐지하고 요청을 보내지 않도록 차단해야하는 필요성이 생기게 되었으며 이를 위해 서킷 브레이커 패턴이 생기게 되었다.
외부 서비스에 의한 문제를 방지하기 위해 등장한 패턴이다.
문제가 발생한 지점을 감지하고 실패하는 요청을 계속하지 않도록 방지한다.
이를 통해 시스템의 장애 확산을 막고, 장애 복구를 도와주며 사용자는 불필요한 대기를 하지 않아도 되게 된다.
일반적으로 회로가 닫혀 있어야 전류가 흐르고, 전구가 과열되어 회로가 열리면 전류가 꺼진다.
해당 원리를 Circuit Breaker에서도 사용한다.
Closed | Open | Half Open | |
---|---|---|---|
상황 | 모든 것이 정상인 상황 | 외부에 장애가 발생한 상황 | Open 상태가 되고 일정 시간이 지난 상황 |
요청 | Open 상태가 되고 일정시간 지난 상황 | 외부로의 요청을 차단하고 바로 에러를 받음 | 외부로의 요청을 차단하고 바로 에러를 받음 |
상태 전이 | 외부로의 요청을 차단하고 바로 에러를 받음 | 특정 시간이 지나면 Half Open 상태가 됨 | 일부 허용된 요청들이 성공한 경우 Closed 상태로, 실패인 경우 Open 상태로 변경한다. |
외부 장애가 발생했는지에 대한 기준
1. slow call
기준 시간보다 오래 걸린 요청
2. failure call
실패하거나 오류를 응답 받은 요청