Lab 06: Distributed Patterns
Overview
Step 1: Circuit Breaker with gobreaker
gobreakerStates: Closed ──(failures≥threshold)──► Open
Open ──(timeout elapsed)─────► Half-Open
Half-Open ──(success)──────────► Closed
Half-Open ──(failure)──────────► Openpackage main
import (
"errors"
"fmt"
"time"
"github.com/sony/gobreaker"
)
func setupCircuitBreaker() *gobreaker.CircuitBreaker {
settings := gobreaker.Settings{
Name: "product-service",
MaxRequests: 3, // max requests in half-open state
Interval: 10 * time.Second, // count window
Timeout: 5 * time.Second, // time in open state
ReadyToTrip: func(counts gobreaker.Counts) bool {
// Trip after 3 consecutive failures
return counts.ConsecutiveFailures >= 3
},
OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) {
fmt.Printf(" ⚡ Circuit '%s': %s → %s\n", name, from, to)
},
}
return gobreaker.NewCircuitBreaker(settings)
}
func callService(cb *gobreaker.CircuitBreaker, fail bool) (string, error) {
result, err := cb.Execute(func() (interface{}, error) {
if fail {
return nil, errors.New("service unavailable")
}
return "ok", nil
})
if err != nil {
return "", err
}
return result.(string), nil
}Step 2: State Transition Demo
Step 3: Retry with Exponential Backoff + Jitter
Step 4: Rate Limiter — Token Bucket
Step 5: Bulkhead Pattern — Semaphore
Step 6: Health Check Endpoint
Step 7: Complete Integration
Step 8: Capstone — Full Demo
Summary
Pattern
Library
Problem Solved
Last updated
