In this article, we'll discuss what software architecture patterns are and review some app architecture patterns. Then we'll dive into the most commonly used software architecture patterns and examine how they function. Then we'll weigh their pros and cons and identify the best software engineering scenarios for achieving quality outcomes with each pattern.
What is App Architecture?
Consider a software project that involves designing a grocery app. To build this app, you'll need to first define its design and architecture, as these are the foundational pillars upon which the rest of the app will be built. For instance, how will the shopping cart function? How will you use an algorithm to suggest products? The list goes on.
A few decades ago, the established patterns for solving these problems were limited. Today, however, software development has evolved to the point that we now have many more architectural models that provide distinct advantages for different app types.
Software architecture patterns are solutions to general software engineering problems that are reoccurring. In the grocery app design we mentioned earlier, we can reuse algorithms that have already been defined for product suggestions and make tweaks according to our app's demands. The architecture involved in implementing the suggestions module is only one part of the architectural pattern here.
Now that we know what a software architecture pattern is, let's understand the reasons to use them. As a software engineer or developer or an architect, here are a few reasons to use an existing architecture pattern for your next project:
- Build more optimized systems: With the use of architecture patterns, we build transferrable models that can be reused, thus contributing to a scalable, extensible, and optimized structure.
- Early design changes: Depending on the pattern implemented, most architecture patterns allow you to make changes in the early stages of development, thus producing a flexible and robust foundational architecture pattern that is error-free.
- Communication among stakeholders: A software architecture pattern represents a simple abstraction of a system that the system's stakeholders can use as a basis for mutual understanding, negotiation, consensus, and communication.
Now that we understand the importance of software architecture patterns, let's consider five common examples and where we could use them in software development.
1. Layered Architecture Pattern
Layered architecture is one of the most common patterns used across the software industry because it is easy to develop and maintain. As the name suggests, the layered architecture follows a tiered approach, where one layer provides services to its higher layer. This is a rather traditional method for designing most software. Its purpose is the separation of concerns, which means that all the components are interconnected but do not depend on each other.
For instance, consider the typical four-layered application architecture pattern below. At the top is the presentation/UI layer, which requests services. At the bottom is the database layer, which provides services to the subsequent higher layers.
Another common example of a layered architecture pattern is the MVC (Model-View-Controller) pattern, which follows a three-layer approach with similar components.
When Is Layered Architecture Appropriate to Use?
Layered architecture is widely used for numerous reasons. You can consider it under the following scenarios/requirements:
- When you aim to design an application quickly with fewer developers.
- Applications that primarily require maintainability and separation of concerns as their pillars of architecture.
- Enterprise applications that need to adopt traditional IT structures and processes.
2. Event-Driven Architecture Pattern
An event-driven architecture pattern is a more modern approach than the layered pattern we saw earlier. This architectural approach is centered around data that describes “events” (such as the click of a button, moving the scroll bar, etc.).
In the layered pattern, data flows from one layer to the other in a designated sequence. An event-driven architecture pattern, on the other hand, allows the application modules to act on defined events as they occur. Event-driven patterns generally fall into two categories: mediator topology or broker topology. The figure below describes the broker topology.
The standard concepts that we come across here include publishers, subscribers, sources, and sinks. The publisher is the component that captures the event data and stores it in an event data store. The subscriber then consumes and potentially responds to the event. Sources are where the data originates, which is triggered by UI events. Sinks are destinations where subscribers send data.
When Can We Opt for the Event-Driven Architecture Pattern?
- The event-driven pattern is best suited for applications that have asynchronous data flow systems.
- Event-driven patterns are extensible and scalable. We can add new modules without making changes to the existing system.
- Developers could use this pattern to build complex applications requiring seamless data flow or those applications that would eventually grow.
3. Microkernel Architecture Pattern
The microkernel architecture pattern is best applied to software applications that need to be flexible enough to adapt to constantly changing system requirements. It is separated into a minimal functional core and extended functionality (plug-ins). The core system consists of general business logic with no custom code for exceptional cases or complex conditional processes. In contrast, the plug-ins are a set of independent components that assist the core by providing specialized processing additional features via custom code. The microkernel serves as a socket for these plug-ins to extend its functionality and power.
When to Use the Microkernel Pattern
- Applications that require or are concerned with the separation between low-level functionalities and higher-level functionalities.
- Since the microkernel pattern provides extensibility, scalability, and portability, it is best used for enterprise applications.
- It is best suited for development teams that are spread out.
4. Microservices Architecture Pattern
The microservices architecture pattern takes the approach of building small independent applications that communicate with each other in order for the entire system (application) to work. The microservices pattern allows us to deploy these small applications independently, thereby providing a high degree of application and component decoupling within the application. For instance, consider the below figure. The multiple services are the small independent applications that make up the entire system.
Source: Microsoft
Microservices has gained importance because it's a feasible alternative to monolithic architecture patterns. In a monolithic architecture, the entire application is built as a single unit that contains all the business logic. In contrast, the microservices architecture is organized as multiple loosely coupled services. For many teams, this makes the microservices approach more appealing than the traditional monolithic system.
When Use the Microservices Approach
- Undoubtedly, microservices works best for teams looking to re-write their monolithic applications to a more sustainable pattern.
- Microservices works best for applications with immense and rapidly growing data systems.
5. Space-Based Architecture Pattern
So far, among the architecture patterns we have seen, the patterns revolve around the database. But suppose our application has many concurrent users and the database reaches its peak capability. What happens then? The database cannot handle the load, and the entire application crashes.
Here is when we come across the concept of tuple space, which is the entire idea behind the space-based architecture pattern. According to Wikipedia:
A tuple space is an implementation of the associative memory paradigm for parallel/distributed computing. It provides a repository of tuples that can be accessed concurrently.
The below figure represents this core principle of the space-based pattern. The processing unit component contains web-based components and backend business logic. Smaller web applications could be deployed in a single unit. At the same time, larger ones can be split into multiple processing units.
Furthermore, the virtualized-middleware component contains elements that control handle requests and data synchronization. One of the primary and most essential features of this pattern is that there is no central database. As discussed earlier, it has a tuple-space or a distributed in-memory system. This provides near-infinite scalability within the application.
Source: O'Reilly
When to Use Space-Based Architecture Pattern?
- For applications and software systems that work under a heavy load of users that access or write to the database concurrently.
- For applications that need to address and solve scalability and concurrency issues.
- It is best suited for e-commerce or social website development.