Architecture Patterns

System architecture patterns provide proven templates for structuring applications and aligning software design with organisational scaling goals. Choosing the right pattern requires balancing development speed, system complexity, and organisational structure.

Here is a high-level overview of key architectural patterns used in modern software design:

1. Micro Frontends

Extends the concept of microservices to frontend development. The user interface is split into independent, domain-owned applications that are composed at runtime or compile-time.

2. Strangler Fig Application

An incremental migration strategy where a legacy monolithic system is gradually replaced by routing specific API paths or frontend routes to new modern services, eventually deprecating the legacy system entirely.

  • Trade-offs: Minimises migration risk by avoiding "big bang" rewrites and delivers business value continuously, but introduces routing/proxy complexity and data synchronization overhead.
  • Resources:

3. Command Query Responsibility Segregation (CQRS)

Separates write operations (commands) from read operations (queries) into distinct data models, allowing each side to scale and optimise independently.

  • Trade-offs: Optimises read/write performance and simplifies domain logic on the write side, but introduces eventual consistency challenges and increased infrastructure complexity.
  • Resources:

4. Microservices

Decomposes an application into a collection of small, loosely coupled services organised around business domains. Each service is fully autonomous and communicates via lightweight APIs.

  • Trade-offs: Strong team autonomy, independent scaling, and high deployment frequency, but introduces operational complexity, distributed tracing challenges, and network latency.
  • Resources:

5. Transactional Outbox

Reliably publishes event notifications in distributed systems. Instead of directly publishing an event to a message broker during a database transaction (which risks inconsistent states if one fails), the event is saved to an "Outbox" table in the same database within the local transaction. A separate relay process reads from this table and publishes the events asynchronously to the message broker.

Explore Next

References

Created: July 14, 2026Last modified: July 14, 2026