Awesome Software Architecture
Curated list of awesome articles and resources to learn and practice software architecture, patterns and principles. This repository will be updated continuously, keep yourself up to date .
I created this repository to share a set of links that I found valuable and inspiring and I share them with others to improve our knowledge together ✌️.
🚀 Go ahead to the official web page here: 🌐 https://awesome-architecture.com
Contents
- Software Architecture
- Actor Model Architecture
- Algorithms
- Clean Architecture
- Onion Architecture
- Hexagonal Architecture
- Vertical Slice Architecture
- Event Driven Architecture
- Service Oriented Architecture
- Domain Driven Design
- Data Driven Design
- CQRS
- Microservices
- Modular Monolith
- Architectural Design Principles
- Design Patterns
- Cloud Design Patterns
- Cloud Best Practices
- Cloud Native
- Platform as a Service
- Infrastructure as a Service
- DevOps
- Reverse Proxy - Load Balancing
- Service Discovery And Registry
- Service Mesh
- Object Oriented Design
- Systems Design
- Scaling
- Back Pressure
- Clean Code
- Abstraction
- Design Best Practices
- Anti Patterns
- Eventual Consistency
- Messaging
- Distributed Transactions
- Distributed Locking
- RESTful API Design
- gRPC
- Caching
- Functional Programming
- Concurrency
- Sharding
- Refactoring
- NoSQL
- Relational Database
- Microsoft Azure Cloud
- Modeling
- Open Source
- Code Review
- Interview
- Architecture Decision Records (ADR)
- Micro-Frontend
- Others
Note: Bellow contents is not complete yet and it's in progress, and I will complete the descriptions over the time, but you are feel free to contribute this part.
Software Architecture
Topic | Description |
---|---|
Software Architecture | Software architecture refers to the fundamental structures of a software system and the discipline of creating such structures and systems. |
Actor Model Architecture
Topic | Description |
---|---|
Actor Model Architecture | The Actor Model is a programming paradigm in which the basic unit of execution is the actor. In the Actor Model, an actor does work by using messages to express actions upon a system or other actors within the given system |
Akka .NET | Akka.NET is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on .NET. |
Microsoft Orleans | Orleans is a cross-platform framework for building robust, scalable distributed applications. |
ProtoActor | Ultra fast distributed actors for Go, C# and Java/Kotlin. |
Algorithms
Topic | Description |
---|---|
Algorithms | An algorithm is a procedure used for solving a problem or performing a computation. |
Clean Architecture
Topic | Description |
---|---|
Clean Architecture | The Clean Architecture is the system architecture guideline proposed by Robert C. Martin (Uncle Bob) derived from many architectural guidelines like Hexagonal Architecture, Onion Architecture, etc... |
Onion Architecture
Topic | Description |
---|---|
Onion Architecture | The Onion architecture, introduced by Jeffrey Palermo, and it is a form of layered architecture and we can visualize these layers as concentric circles. |
Hexagonal Architecture
Topic | Description |
---|---|
Hexagonal Architecture | The Hexagonal Architecture or Ports and Adapters architecture, introduced by Alistair Cockburn and it's an architectural pattern that allows input by users or external systems to arrive into the Application at a Port via an Adapter, and allows output to be sent out from the Application through a Port to an Adapter. |
Vertical Slice Architecture
Topic | Description |
---|---|
Vertical Slice Architecture | The vertical slice architecture is a technique that helps us build maintainable applications by separating the application around features or vertical slices . |
Event Driven Architecture
Topic | Description |
---|---|
Event Driven Architecture | Event-driven architecture is a software design pattern in which decoupled applications can asynchronously publish and subscribe to events via an event broker. |
Service Oriented Architecture
Topic | Description |
---|---|
Service Oriented Architecture | Service Oriented Architecture (SOA) is a software architecture design pattern in which application components provide services to other components using a communication protocol over a network. SOA aims to achieve loose coupling between software components, allowing them to be easily replaced or updated without affecting the rest of the system. |
Domain Driven Design
Topic | Description |
---|---|
Domain Driven Design | The key concepts and principles of Domain Driven Design, which emphasizes the importance of building a software system around a shared understanding of the business domain and the use of ubiquitous language. |
Value Objects | The concept of value objects in Domain Driven Design, which are immutable objects that represent a concept or measurement and are characterized by their value, rather than their identity. |
Aggregation | The concept of aggregation in Domain Driven Design, which is a way of grouping objects together to form a logical unit that can be treated as a single entity. |
Anemic Domain Model | The Anemic Domain Model anti-pattern in Domain Driven Design, which refers to a model where the domain objects contain little or no behavior and the business logic is instead implemented in separate services. |
Rich Domain Model | The Rich Domain Model pattern in Domain Driven Design, which advocates for placing behavior and business logic in the domain objects themselves, rather than in separate services. |
Domain Model | The Domain Model concept in Domain Driven Design, which is a representation of the core concepts, entities, and relationships that make up a business domain. |
Domain Service | The Domain Service concept in Domain Driven Design, which is a stateless, transactional operation that performs a business task and is not associated with any specific entity. |
Application Service | The Application Service concept in Domain Driven Design, which is responsible for coordinating the execution of multiple domain services to achieve a higher-level business goal. |
Domain Events | The Domain Events concept in Domain Driven Design, which are messages that represent a significant occurrence within the business domain and can be used to trigger downstream processes or updates to other systems. |
Integration Events | The Integration Events concept in Domain Driven Design, which are messages that represent a significant occurrence in the context of an external system and can be used to trigger downstream processes or updates to the local system. |
Bounded Context | The Bounded Context concept in Domain Driven Design, which is a way of dividing a large, complex business domain into smaller, more manageable parts that are defined by a common language, context, and set of boundaries. |
Infrastructure | The Infrastructure concept in Domain Driven Design, which includes all the components and systems that support the operation of the application, such as databases, message brokers, and third-party services. |
Tactical Design Patterns | The Tactical Design Patterns in Domain Driven Design, which are recurring solutions to common problems that arise when building domain models, services, and repositories. |
Strategic Design Patterns | The Strategic Design Patterns in Domain Driven Design, which are high-level principles and patterns that guide the overall architecture and organization of a large, complex software system. |
Mappings | The concept of mappings in Domain Driven Design, which are the mechanisms used to transform data between the domain model and other parts of the system, such as the database or user interface. |
Domain Primitives | The Domain Primitives concept in Domain Driven Design, which are simple, immutable value types that represent basic concepts in the domain, such as dates, times, and quantities. |
Enum | The Enum concept in Domain Driven Design, which is a special type of domain primitive that represents a discrete set of values. |
Exception and Validation | The concepts of exception handling and validation in Domain Driven Design, which are important mechanisms for ensuring the correctness and robustness of the application. |
Data Driven Design
Topic | Description |
---|---|
Data Driven Design | Data-Driven Design is a software development methodology that emphasizes the use of data and analytics to inform design decisions. It involves collecting, analyzing, and using data to create and improve software products, services, and experiences. This approach relies on empirical evidence to guide design choices, and it requires a strong data infrastructure and analytics capabilities. Data-Driven Design can help organizations create more effective, efficient, and user-friendly products and services by making informed decisions based on real-world data. It can also lead to better customer engagement, increased revenue, and improved user satisfaction. |
CQRS
Topic | Description |
---|---|
CQRS | CQRS (Command Query Responsibility Segregation) is a design pattern that separates the concerns of command execution and data querying in a system. The basic idea behind CQRS is to split the application model into two separate models: one for reading data and another for writing data. This allows the two models to be optimized for their specific purposes, and provides benefits such as better scalability, performance, and maintainability. The CQRS pattern is often used in conjunction with event sourcing, which is a technique for capturing all changes to an application state as a sequence of events. Together, CQRS and event sourcing can provide a powerful way to build highly scalable and fault-tolerant systems. |
Microservices
Topic | Description |
---|---|
Microservices | A brief introduction to the concept of microservices, including their benefits and drawbacks, as well as common characteristics of microservices architecture. |
Communication | An overview of the different communication patterns and protocols that can be used in microservices architecture, such as synchronous vs. asynchronous communication, REST vs. message-based communication, and the use of service buses. |
Composite UI | A discussion of the Composite UI pattern, which involves combining multiple microservices into a single user interface, and the different approaches to implementing it, such as server-side composition vs. client-side composition. |
Service Boundaries | An exploration of how to define and enforce service boundaries in microservices architecture, including strategies for identifying service boundaries and techniques for implementing them, such as domain-driven design and bounded contexts. |
Testing | A guide to testing microservices, including strategies for testing individual services and testing the interactions between services, as well as tools and frameworks for testing microservices. |
API Gateway | An introduction to the concept of an API Gateway, which acts as a single entry point for clients to access multiple microservices, and the benefits and drawbacks of using an API Gateway. |
API Gateway - Ambassador | A specific implementation of an API Gateway using the Ambassador open-source project, including an overview of its features and how to configure and deploy it. |
API Gateway - Kong | A specific implementation of an API Gateway using the Kong open-source project, including an overview of its features and how to configure and deploy it. |
API Gateway - Ocelot | A specific implementation of an API Gateway using the Ocelot open-source project, including an overview of its features and how to configure and deploy it. |
Observability | An exploration of the concept of observability in microservices architecture, which involves the ability to monitor and debug distributed systems, and the different techniques and tools for achieving observability, such as logging, tracing, health checks ,and monitoring. |
Observability - Distributed Tracing | A deep dive into the use of distributed tracing as a tool for achieving observability in microservices architecture, including an overview of how distributed tracing works, common tracing frameworks, and how to instrument microservices for tracing. |
Observability - Monitoring | An overview of the different types of monitoring that can be used in microservices architecture, such as system monitoring, application monitoring, and business monitoring, and the different tools and approaches for monitoring microservices. |
Observability - Diagnostics | An overview of the different techniques and tools for diagnosing and debugging issues in microservices architecture, including log analysis. |
Observability - Logging | Logging is an important aspect of observability in microservices architecture. This topic covers different logging frameworks and strategies used for monitoring and troubleshooting distributed systems. |
Observability - CorrelationId | Correlation ID is a technique used to track requests across multiple microservices. This topic explains what Correlation ID is and how it is implemented in a distributed system. |
Observability - Tools - EFK | EFK stack (Elasticsearch, Fluentd, and Kibana) is a popular logging and observability solution. This topic covers the basics of EFK, how it works, and how to set it up in a microservices architecture. |
Observability - Tools - ELK | ELK stack (Elasticsearch, Logstash, and Kibana) is another popular logging and observability solution. This topic covers the basics of ELK, how it works, and how to set it up in a microservices architecture. |
Observability - Tools - Fluent Bit | Fluent Bit is a lightweight and efficient log processor and forwarder. This topic covers the basics of Fluent Bit, how it works, and how to set it up in a microservices architecture. |
Observability - Tools - FluentD | Fluentd is an open-source log collector and aggregator. This topic covers the basics of Fluentd, how it works, and how to set it up in a microservices architecture. |
Observability - Tools - Loki | Loki is a horizontally-scalable, highly-available log aggregation system. This topic covers the basics of Loki, how it works, and how to set it up in a microservices architecture. |