On this page
Failure Detection
In an asynchronous network, if a node does not reply to a message, is it truly dead or just slow? The φ-accrual failure detector does not answer "yes or no," but instead outputs a "probability that it is dead," allowing upper-layer protocols to make their own decisions based on business sensitivity. SWIM combines this probability calculation with gossip-based membership propagation.
Why Failure Detection is Hard
In asynchronous networks (without synchronized clocks or upper bounds on message delays), it is impossible to perfectly distinguish between a "node crash" and "slow network." Any timeout-based detection mechanism is prone to false positives. Failure detectors must provide the "most reasonable" suspicion under such uncertainty.
Simple Heartbeat
Every T seconds: Node A sends a heartbeat → to node B
If B does not receive a response within timeout (e.g., 3T) → mark A as dead
Problem: Fixed timeouts are too rigid. Network jitter leads to false positives. Increasing the timeout increases the detection delay for actual crashes.
φ-accrual Failure Detector
Instead of outputting a binary alive/dead status, it outputs φ: suspicion level—how unlikely it is that the node is currently alive. The upper-layer application can decide "what φ value triggers a failover."
Principle
Record the distribution of historical heartbeat arrival intervals (mean μ, variance σ²). For each delayed arrival (current time - last heartbeat arrival time = t), calculate φ:
φ = -log10(P(arrival interval > t | distribution))
If heartbeats usually arrive within 100ms, but this time it took 500ms—that is highly unlikely → φ is large. If it took 150ms—that might just be jitter → φ is small.
Advantages:
- Adaptive: Makes decisions based on actual network conditions (not fixed "3 timeouts")
- Configurable: Different services can use different φ thresholds. Low-latency critical services → failover at φ=5. Background services → failover at φ=10
Applications: Akka (JVM actor framework), Cassandra (PhiConvictAdaptive failure detector).
SWIM (Scalable Weakly-consistent Infection-style Membership)
The most widely used failure detection and membership discovery protocol (used under the hood by Consul, Serf, Tailscale).
Protocol
Each member runs independently:
Every T₁ seconds (e.g., 1s):
1. Randomly select a member P
2. Send PING → P
3. If P does not reply with ACK within T₂ (e.g., 500ms):
→ indirect ping: Randomly select K members (e.g., 3), ask them to ping P
→ If all K members receive ACK → P is alive
→ If none of the K members receive ACK → P is suspected
4. Start gossip:
- If P is suspected: Select M random members, send gossip message: P is suspected
- Gossip receiver: Stores this information. If it successfully pings P itself → refutes suspicion (sends alive message)
SWIM vs Heartbeat
- Heartbeat: O(N) messages per second (each member sends to all other members)
- SWIM: O(1) ping per member per period + gossip = extremely low bandwidth, supports thousands of nodes
- SWIM's indirect ping significantly reduces false positives: Direct member-to-member connections may drop packets due to local network faults, but if multiple other nodes can ping P → it is not dead
Timeout Strategies
TCP connect timeouts, RPC deadlines, gossip suspicion timeouts—all address the same problem. Design principles:
- Set based on p99.9 latency: Timeouts must be > p99.9 latency, otherwise the false positive rate is unacceptable
- Distinguish between timeout and deadline: timeout = maximum wait time for network/RPC; deadline = final deadline for the entire operation (after multiple retries)
- Retry with exponential backoff + jitter: Prevent thundering herd → all waiting clients retry simultaneously → taking down the just-recovered service
- Budget timeout: Allocate the total timeout for the entire request chain (A→B→C→D) across its components → fail fast without dragging down the entire chain
References
- Paper: "The φ Accrual Failure Detector" (Hayashibara et al, 2004)
- Paper: "SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol" (Das et al, 2002)
- Serf: serf.io (HashiCorp, SWIM implementation)
Keywords: heartbeat, φ-accrual, SWIM, indirect ping, gossip, failure detector, membership protocol