Skip to main content

Command Palette

Search for a command to run...

25 System Design Patterns Every Software Architect Should Know

Updated
6 min readView as Markdown
B
Senior Software Architect with 30+ years of experience building enterprise systems using Java, Spring Boot, and cloud-native technologies.

Software architecture isn't about memorising technologies.

It's about recognising patterns.

The best architects don't reinvent solutions for every new project. They identify recurring problems, understand the trade-offs, and apply proven design patterns that have been validated by thousands of production systems.

Whether you're designing a startup application or a global platform serving millions of users, you'll encounter many of the same architectural challenges:

  • How do you scale?

  • How do you ensure reliability?

  • How do you reduce latency?

  • How do you integrate services?

  • How do you protect data?

  • How do you evolve without breaking everything?

This is where system design patterns become invaluable.

Here are 25 essential system design patterns every software architect should master.


1. Load Balancer

Distributes incoming requests across multiple servers.

Why it matters

  • Eliminates single-server bottlenecks

  • Improves availability

  • Enables horizontal scaling

Examples

  • NGINX

  • HAProxy

  • AWS Application Load Balancer


2. Caching

Store frequently accessed data closer to users.

Benefits

  • Lower latency

  • Reduced database load

  • Better user experience

Examples

  • Redis

  • Memcached

  • CDN caching


3. Database Replication

Maintain multiple copies of the database.

Advantages

  • High availability

  • Read scalability

  • Disaster recovery

Common model:

  • One primary

  • Multiple read replicas


4. Database Sharding

Split data across multiple databases.

Ideal when a single database can no longer handle traffic.

Typical sharding keys:

  • User ID

  • Region

  • Customer ID

  • Tenant ID


5. CQRS (Command Query Responsibility Segregation)

Separate write operations from read operations.

Benefits:

  • Independent scaling

  • Optimised read models

  • Better performance

Common in high-scale enterprise systems.


6. Event Sourcing

Persist every state change as an immutable event.

Advantages:

  • Complete audit trail

  • Easy replay

  • Temporal debugging

  • Regulatory compliance

Popular in fintech and banking.


7. Event-Driven Architecture

Services communicate through events instead of direct API calls.

Benefits:

  • Loose coupling

  • Better scalability

  • Improved resilience

Common technologies:

  • Kafka

  • RabbitMQ

  • Amazon EventBridge


8. Saga Pattern

Manage distributed transactions without two-phase commit.

Approaches:

  • Choreography

  • Orchestration

Essential for microservices.


9. Circuit Breaker

Stop calling unhealthy services.

Benefits:

  • Prevent cascading failures

  • Faster recovery

  • Improved resilience

Libraries:

  • Resilience4j

  • Hystrix (legacy)


10. Bulkhead Pattern

Isolate resources into separate pools.

Similar to watertight compartments on ships.

Failure in one area doesn't sink the whole system.


11. Retry Pattern

Automatically retry transient failures.

Best practices:

  • Exponential backoff

  • Jitter

  • Maximum retry limit


12. Rate Limiting

Protect systems from abuse.

Methods:

  • Token Bucket

  • Leaky Bucket

  • Fixed Window

  • Sliding Window

Widely used in API gateways.


13. API Gateway

Single entry point for clients.

Responsibilities:

  • Authentication

  • Routing

  • Rate limiting

  • Logging

  • Request aggregation

Examples:

  • Kong

  • Spring Cloud Gateway

  • AWS API Gateway


14. Backend for Frontend (BFF)

Dedicated backend per client type.

Examples:

  • Mobile API

  • Web API

  • Smart TV API

Benefits:

  • Faster front-end development

  • Client-specific optimisation

  • Reduced over-fetching


15. Service Discovery

Automatically locate service instances.

Popular options:

  • Eureka

  • Consul

  • Kubernetes DNS

Critical for dynamic environments.


16. Sidecar Pattern

Deploy helper services alongside applications.

Common uses:

  • Logging

  • Monitoring

  • Security

  • Service mesh

Examples:

  • Envoy Proxy

  • Istio


17. Ambassador Pattern

Proxy outbound communication.

Benefits:

  • Centralised networking

  • Security

  • Traffic management


18. Strangler Fig Pattern

Gradually replace legacy systems.

Instead of rewriting everything:

Old System

New Components

Complete Migration

Lower risk.

Higher success rate.


19. Leader Election

Elect one instance to coordinate distributed work.

Common scenarios:

  • Scheduler

  • Batch processing

  • Cluster coordination


20. Distributed Lock

Prevent concurrent operations across nodes.

Examples:

  • Redis Lock

  • ZooKeeper

  • etcd

Useful for inventory, payments and scheduling.


21. Idempotency Pattern

Repeated requests produce the same result.

Critical for:

  • Payment APIs

  • Order creation

  • Distributed retries

Avoids duplicate processing.


22. Outbox Pattern

Guarantee database updates and event publishing stay consistent.

Workflow:

  • Write business data

  • Write outbox event

  • Background publisher sends message

Widely adopted in microservices.


23. Database per Service

Each microservice owns its data.

Benefits:

  • Loose coupling

  • Independent deployment

  • Autonomous teams

Avoid shared databases whenever possible.


24. Shared-Nothing Architecture

Each node operates independently.

Advantages:

  • Horizontal scalability

  • Fault isolation

  • Cloud-native design

Foundation of many internet-scale systems.


25. Hexagonal Architecture (Ports & Adapters)

Separate business logic from infrastructure.

Your domain should never depend on:

  • Database

  • Framework

  • UI

  • External APIs

Instead:

Core Business Logic

Ports

Adapters

Infrastructure

This makes systems easier to test, maintain and evolve.


Final Thoughts

The biggest mistake architects make isn't choosing the wrong technology.

It's applying the wrong pattern to the wrong problem.

Great software architecture isn't about using microservices, Kafka, Kubernetes, or the latest cloud platform.

It's about understanding the forces at play—scalability, consistency, availability, latency, resilience, maintainability and cost—and selecting the patterns that best balance those trade-offs.

The most successful systems are rarely built on a single architectural pattern. They combine multiple patterns to address different concerns:

  • API Gateway + BFF for client communication

  • CQRS + Event Sourcing for complex business domains

  • Cache + Load Balancer + Replication for high performance

  • Saga + Outbox + Idempotency for reliable distributed workflows

  • Circuit Breaker + Retry + Bulkhead for resilience

  • Sidecar + Service Discovery for cloud-native operations

As your systems grow, your ability to recognise and apply these patterns becomes one of the most valuable skills you can develop as a software architect.


Which system design pattern has had the biggest impact on the systems you've built? Share your experience in the comments—I’d love to hear your insights.

More from this blog

B

Bill LIao's Blog

137 posts

A technical blog on modern backend development, software architecture, and practical AI agent workflows