Distributed System Design Patterns
Cloud / Distributed System Design Patterns
Circuit Breaker Pattern
classDiagram
class CircuitBreaker {
+call(service)
+trip()
+reset()
-state
}
class Service {
+handleRequest()
}
CircuitBreaker --> Service : delegates
The Circuit Breaker pattern prevents cascading failures in distributed systems by monitoring remote service calls. If a service call fails repeatedly, the circuit breaker trips to an open state, stopping further calls until the service is deemed healthy again.
API Gateway Pattern
classDiagram
class APIGateway {
+routeRequest()
}
class Client {
+sendRequest()
}
class MicroserviceA {
+processRequest()
}
class MicroserviceB {
+processRequest()
}
Client --> APIGateway : sends requests
APIGateway --> MicroserviceA : forwards
APIGateway --> MicroserviceB : forwards
The API Gateway pattern acts as a single entry point into a system of microservices. It routes client requests to the appropriate backend services, handles authentication, rate limiting, and can perform protocol translation.
Service Discovery Pattern
classDiagram
class ServiceRegistry {
+register(service)
+deregister(service)
+discover(serviceName)
}
class ServiceInstance {
+serviceID
+address
}
class Client {
+lookupService()
}
ServiceRegistry o-- ServiceInstance : manages
Client --> ServiceRegistry : queries
The Service Discovery pattern enables dynamic registration and lookup of service instances in a distributed environment. This is critical for systems where services scale up or down and change their network locations frequently.
Event Sourcing Pattern
classDiagram
class Aggregate {
+applyEvent(event)
}
class EventStore {
+append(event)
+getEvents(aggregateId)
}
Aggregate --> EventStore : persists events
The Event Sourcing pattern stores all changes to the application state as a sequence of events. The current state is rebuilt by replaying these events, providing a full audit trail and enabling complex event-driven architectures.
CQRS Pattern
classDiagram
class CommandHandler {
+handleCommand(command)
}
class QueryHandler {
+handleQuery(query)
}
class DataStore {
+writeData()
+readData()
}
CommandHandler --> DataStore : writes
QueryHandler --> DataStore : reads
The Command Query Responsibility Segregation (CQRS) pattern separates the write (command) and read (query) operations into different models. This separation can optimize performance, scalability, and security in distributed systems.