-
Notifications
You must be signed in to change notification settings - Fork 1
CircuitBreaker
Marco Breveglieri edited this page Jul 20, 2026
·
2 revisions
The Circuit Breaker prevents cascading failures by temporarily blocking calls to failing services.
- Calling external services that may fail
- Preventing resource waste on failing operations
- Fast-fail scenarios (don't wait for timeout)
- Protecting downstream services from overload
- Operations that must always attempt execution
- Single-attempt operations (use Retry instead)
- Operations with no downstream dependencies
uses Murphy.Policy.CircuitBreaker;
var
Policy: ICircuitBreakerPolicy;
begin
Policy := TCircuitBreakerBuilder
.Handle(Exception)
.Fail(3)
.Within(TTimeSpan.FromSeconds(30))
.Build;
Policy.Execute(procedure begin CallExternalService; end);
end;type
TAPIClient = class
private
FCircuitBreaker: ICircuitBreakerPolicy;
public
constructor Create;
function GetData: string;
end;
constructor TAPIClient.Create;
begin
FCircuitBreaker := TCircuitBreakerBuilder
.Handle([EIdHTTPProtocolException, EIdSocketError])
.Fail(5)
.Within(TTimeSpan.FromMinutes(1))
.Build;
end;
function TAPIClient.GetData: string;
begin
try
FCircuitBreaker.Execute(
procedure
begin
Result := HTTP.Get('https://external-api.com/data');
end);
except
on E: EBrokenCircuitException do
raise Exception.Create('Service temporarily unavailable');
end;
end;var Policy: ICircuitBreakerPolicy;
begin
Policy := TCircuitBreakerBuilder.Handle(Exception).Fail(3).Build;
// Manual isolation for maintenance
Policy.Isolate;
// Later...
Policy.Reset;
end;procedure MonitorService;
var
Policy: ICircuitBreakerPolicy;
begin
Policy := TCircuitBreakerBuilder.Handle(Exception).Fail(2).Build;
while True do
begin
case Policy.CircuitState of
TCircuitState.Closed: WriteLn('Service: Healthy');
TCircuitState.Open: WriteLn('Service: DOWN');
TCircuitState.HalfOpen: WriteLn('Service: Testing recovery');
TCircuitState.Isolated: WriteLn('Service: Maintenance mode');
end;
Sleep(5000);
end;
end;- Configure appropriate thresholds - Balance between sensitivity and tolerance
- Set reasonable recovery times - Allow enough time for service recovery
- Log circuit state changes - For monitoring and alerting
- Handle broken circuit exceptions - Provide fallback behavior
- Monitor circuit health - Track open/close events
Closed → (failures >= threshold) → Open
Open → (duration elapsed) → HalfOpen
HalfOpen → (success) → Closed
HalfOpen → (failure) → Open