Test setup
fluxgo is evaluated on a chain of four Go microservices where every outbound call goes through a circuit breaker and a fault-injection proxy.
k6 load generator │ ▼ gateway :8080 ──Toxiproxy :8481──▶ auth :8081 ──Toxiproxy :8482──▶ user :8082 ──Toxiproxy :8483──▶ notification :8083 [breaker] [breaker] [breaker] (terminal service)- Three breakers, one per hop (gateway → auth, auth → user, user → notification). Each is either fluxgo or gobreaker, chosen at startup with
CB_MODE. - Toxiproxy sits on every link so latency, timeouts, bandwidth limits or a full outage can be injected between any two services.
- k6 drives the load against the gateway.
- Every service logs one JSON line per request and exposes its breaker state at
GET /debug/cb(see Snapshot).
Hardware profiles
Section titled “Hardware profiles”Each scenario runs under two resource limits per container, to see how the breakers behave when the services are starved.
| Profile | CPU | Memory |
|---|---|---|
| Spec-A (standard) | 2 vCPU | 2048 MB |
| Spec-B (constrained) | 0.5 vCPU | 256 MB |
Same parameters for both breakers
Section titled “Same parameters for both breakers”For a fair comparison, gobreaker’s static trip ratio equals fluxgo’s baseline threshold, and both share the same recovery timeout and half-open quota:
| Setting | gobreaker | fluxgo |
|---|---|---|
| Trip threshold | failure ratio ≥ 0.6 or 5 consecutive failures | θₜ around ThetaBase = 0.6, adaptive |
| Open → Half-Open | Timeout = 60s | RecoveryTimeout = 60s |
| Half-Open probes | MaxRequests = 1 | HalfOpenMaxRequests = 1 |
Scenarios
Section titled “Scenarios”| Scenario | Load | Fault | What it measures |
|---|---|---|---|
| Normal load | Steady, 5 min | None | False trips and overhead on a healthy system |
| Traffic spike | 10 → 250 virtual users in 10 s | Bandwidth limit | False trips under a legitimate spike |
| Gradual degradation | Steady, 5 min | Latency +50 ms … +500 ms on user → notification | How early the breaker reacts to slow decay |
| Sudden failure | Steady, 3 min | Timeout at second 60 | Detection delay on a hard outage |
Each scenario is repeated for both breakers, alternating which one runs first to avoid thermal or caching bias. See Metrics for how runs are scored.