Let’s talk about what’s next

Whether you're working through a challenge or ready to move on something new, we're ready.

Looking to join the team?

Find your next challenge

Please enter a name

Please enter a company

Please enter an email

Please enter a valid email

Please enter a phone

Please enter a valid phone

Please tell us about your challenge or opportunity

Start a conversation

Thanks

Your message has been sent.
We will get back to you within 1–2 business days.

Something went wrong while sending. Please try again, or email us at info@parserdigital.com.

Insights

Resilience in Microservices: Bulkhead vs Circuit Breaker

In the world of microservices, resilience is key. Services are designed to be independent and loosely coupled, meaning they must be able to operate in isolation without impacting other services.

11 Jul 2024
Andoni Aberasturi Ramírez
Software Architecture

Introduction

In the world of microservices, resilience is key. Services are designed to be independent and loosely coupled, meaning they must be able to operate in isolation without impacting other services. However, this independence can also create new challenges when it comes to ensuring that the system as a whole remains resilient. Two popular patterns for addressing these challenges are the bulkhead and circuit breaker patterns.

Bulkheads

The bulkhead pattern is a metaphorical reference to the watertight compartments in a ship’s hull. The idea is to separate different parts of the system so that a failure in one area does not bring down the entire system. In microservice architecture, this means dividing the system into separate pools of resources, such as thread pools, database connections, or network connections. By doing so, you limit the impact of any one failure, making it easier to isolate and recover from incidents.

Watertight bulkheads (Image created using Canva)
Watertight bulkheads (Image created using Canva)

Circuit Breaker

The circuit breaker pattern is based on the electrical circuit breaker, designed to automatically cut off the flow of electricity when there is a fault or overload. In the context of microservices, the circuit breaker acts as a proxy between services, monitoring the health of requests and responses. If it detects a problem, such as a timeout or error rate exceeding a threshold, it opens the circuit and sends a response back to the client indicating that the service is unavailable. This allows the client to handle the error gracefully and fall back to another service or retry the request later.

Electrical circuit breaker (Image created using Canva)
Electrical circuit breaker (Image created using Canva)

While both patterns are designed to improve resilience, they differ in their approach and application.

The bulkhead pattern is typically applied to resource pools that are shared across multiple services, such as a database or a messaging queue. By dividing the resources into separate pools, you prevent a single service from monopolising the resources and potentially causing a cascading failure. For example, if one service is experiencing a high volume of traffic, it may consume all available database connections, leaving other services unable to access the database. By using a bulkhead pattern, you can limit the number of connections available to each service, ensuring that no single service can cause a bottleneck.

Bulkhead pattern in action

In contrast, the circuit breaker pattern is applied to the communication between services. It is designed to protect against cascading failures caused by a single service failure. For example, if a service is unavailable or slow to respond, the clients that depend on that service may also become unresponsive, causing a chain reaction. By using a circuit breaker, you can isolate the failure and prevent it from spreading to other parts of the system. The circuit breaker also allows for graceful degradation, meaning that the system can continue to function, albeit with reduced functionality, even if a service is unavailable.

Circuit Breaker pattern in action
Circuit Breaker pattern in action

Another key difference between the two patterns is their granularity. The bulkhead pattern is typically applied at the service level, while the circuit breaker pattern is applied at the API or endpoint level. This means that the bulkhead pattern is better suited for addressing performance and capacity issues, while the circuit breaker pattern is better suited for addressing availability and fault tolerance issues.

Conclusion

In summary, the bulkhead pattern and circuit breaker pattern are two popular patterns for improving resilience in microservice architecture. The bulkhead pattern is used to separate resource pools and prevent a single service from monopolising resources. The circuit breaker pattern is used to isolate failures and prevent cascading failures across the system. Both patterns are important tools in the microservice toolbox, and their application depends on the specific needs and requirements of the system. By using these patterns effectively, you can build systems that are resilient, scalable, and fault-tolerant.

Further Reading

“Building Microservices” by Sam Newman
A comprehensive guide on microservices architecture, detailing best practices, principles, and patterns for building scalable and resilient systems.

“Microservice Architecture” by Martin Fowler
This book provides an in-depth exploration of microservices architecture, its benefits, and the challenges involved in its implementation.

“Implementing Domain-Driven Design” by Vaughn Vernon
A detailed resource on domain-driven design, offering practical advice and techniques for building complex software systems that are scalable and maintainable.