Course contentsShow
← Databases & SQL
Lesson 1361 of 1,95312. Key-Value and Caching EnginesFree lesson

Implementing Circuit Breaker Patterns

Ensure system resilience by using cached failure flags to trip external requests.

In this lesson, you will learn how to use a caching layer to act as a "Circuit Breaker," preventing your database from being overwhelmed by requests when a downstream service or specific query path is failing.

The Problem: Cascading Failures

When a database or an external service starts timing out, your application often continues to hammer it with requests. This creates a "retry storm," which consumes threads and memory, eventually leading to a complete system crash. A Circuit Breaker acts like an electrical fuse: when failure thresholds are met, it "trips," immediately blocking further requests for a set duration, allowing the failing component to recover.

Implementing via Cache

While many frameworks offer circuit breaker libraries, you can implement a powerful, distributed version using a high-performance key-value store (like Redis). By using an ephemeral flag in your cache, you can share the "circuit state" across all your application nodes.

Here is the logic for an outbound request:

# Before hitting the database/service
is_blocked = cache.get("circuit_breaker:db_service")

if is_blocked:
    # Fail fast! Do not even attempt the database call
    raise Exception("Circuit is open. Skipping database request.")

try:
    result = db.execute(query)
except DatabaseError:
    # Trip the circuit for 30 seconds
    cache.set("circuit_breaker:db_service", "OPEN", ex=30)
    raise

Why use the Cache?

Using an in-memory cache for this state offers two critical advantages:

  1. Global Awareness: If one application instance detects that the database is down, the cache flag ensures all other instances stop sending traffic immediately.
  2. Low Latency: Checking a cache key is significantly faster than waiting for a connection timeout from a struggling database.

Once the 30-second expiry passes, the key disappears from the cache. The next request will naturally attempt to hit the database again; if it succeeds, the circuit remains closed. If it fails, the cycle repeats. This simple "fail-fast" mechanism prevents your system from cascading into a total outage, preserving resources for other healthy parts of your application.

Key Takeaway: Use ephemeral cache keys as shared state flags to "trip" the circuit, ensuring your application fails fast rather than overwhelming a struggling database.