Unveiling Design Patterns: A Visual Guide with UML Diagrams
Â
Circuit Breakers with Swift
1. Circuit Breakers with Swift âĄ
Swift Cloud Workshop 3
Manny Guerrero
(@SwiftyGuerrero)
2. Agenda
⢠History of Circuit Breakers đ§
⢠How a Circuit Breaker Works đ
⢠Advantages/Disadvantages with Swift đ
⢠Implementation in Swift đ
⢠Demo đ
⢠Q & A đ
3. History of Circuit Breakers
⢠Early beginnings in electrical engineering
⢠Was popularized in software by Michael T. Nygard
5. Advantages/Disadvantages with Swift
Advantages:
⢠Reduces CPU resources
⢠Can protect parts of a system from failures in other
parts
⢠Easy monitoring of the state
Disadvantages:
⢠Managing the state can be diďŹcult if OOP isnât
being used.
⢠Need to use speciďŹc Timer APIs
8. Implementation in Swift
enum BreakerState {
case open
case halfOpened
case closed
}
class CircuitBreaker {
var state: BreakerState {
return .closed
}
}
9. Implementation in Swift
enum BreakerState {
case open
case halfOpened
case closed
}
class CircuitBreaker {
var state: BreakerState {
return .closed
}
var workToPerform: ((CircuitBreaker) -> Void)?
var tripped: ((CircuitBreaker, Error?) -> Void)?
}
10. Implementation in Swift
enum BreakerState {
case open
case halfOpened
case closed
}
class CircuitBreaker {
var state: BreakerState {
return .closed
}
var workToPerform: ((CircuitBreaker) -> Void)?
var tripped: ((CircuitBreaker, Error?) -> Void)?
let maxFailures: Int
let timeout: TimeInterval
let retryDelay: TimeInterval
}
11. Implementation in Swift
enum BreakerState {
case open
case halfOpened
case closed
}
class CircuitBreaker {
var state: BreakerState {
return .closed
}
var workToPerform: ((CircuitBreaker) -> Void)?
var tripped: ((CircuitBreaker, Error?) -> Void)?
let maxFailures: Int
let timeout: TimeInterval
let retryDelay: TimeInterval
private var lastFailureTime: TimeInterval?
private var lastError: Error?
private var scheduler: Scheduler?
}
12. Implementation in Swift
enum BreakerState {
case open
case halfOpened
case closed
}
class CircuitBreaker {
var state: BreakerState {
if let lastFailureTime = self.lastFailureTime,
failureCount > maxFailures &&
(Date().timeIntervalSince1970 - lastFailureTime) > retryDelay {
return .halfOpened
}
if failureCount == maxFailures {
return .open
}
return .closed
}
var workToPerform: ((CircuitBreaker) -> Void)?
var tripped: ((CircuitBreaker, Error?) -> Void)?
let maxFailures: Int
let timeout: TimeInterval
let retryDelay: TimeInterval
private var lastFailureTime: TimeInterval?
private var lastError: Error?
private var scheduler: Scheduler?
}
13. Implementation in Swift
enum BreakerState {
case open
case halfOpened
case closed
}
class CircuitBreaker {
var state: BreakerState {
if let lastFailureTime = self.lastFailureTime,
failureCount > maxFailures &&
(Date().timeIntervalSince1970 - lastFailureTime) > retryDelay {
return .halfOpened
}
if failureCount == maxFailures {
return .open
}
return .closed
}
var workToPerform: ((CircuitBreaker) -> Void)?
var tripped: ((CircuitBreaker, Error?) -> Void)?
let maxFailures: Int
let timeout: TimeInterval
let retryDelay: TimeInterval
private var lastFailureTime: TimeInterval?
private var lastError: Error?
private var scheduler: Scheduler?
init(timeout: TimeInterval = 10, maxFailures: Int = 3, retryDelay: TimeInterval = 2) {
self.timeout = timeout
self.maxFailures = maxFailures
self.retryDelay = retryDelay
}
deinit {
scheduler?.suspend()
scheduler = nil
}
}
14. Implementation in Swift
extension CircuitBreaker {
func start() {
switch state {
case .open:
tripCircuit()
case .halfOpened, .closed:
beginWork()
}
}
}
15. Implementation in Swift
extension CircuitBreaker {
func start() {
switch state {
case .open:
tripCircuit()
case .halfOpened, .closed:
beginWork()
}
}
}
private extension CircuitBreaker {
func tripCircuit() {
tripped?(self, lastError)
reset()
}
func beginWork() {
scheduler?.suspend()
startTimeoutTimer()
workToPerform?(self)
}
}
22. IBM-Swiftâs Circuit Breaker
⢠Provides a heavy duty implementation
⢠Provides advanced conďŹguration
⢠Provides a snapshot of the circuit
breaker state
⢠Can plug in with SwiftMetrics