Microservices vs Monolith
Reference:
- Microservices vs Monolith: which architecture is the best choice for your business?
- Architecting for Reliable Scalability
Monolithic Architecture
The monolithic architecture is considered to be a traditional way of building applications.
Normally, monolithic applications have one large code base and lack modularity. If developers want to update or change something, they access the same code base. So, they make changes in the whole stack at once.
Strengths
- Less Cross-Cutting Concerns: Managing logging, caching, and performance monitoring is simpler since they are handled within one unified application context.
- Easier Debugging and Testing: Debugging and testing are more straightforward because the application is a single unit, allowing faster end-to-end testing processes.
- Simple Deployment: Deployment is simplified, as the entire application is packaged and deployed as a single file or directory.
- Ease of Development: Development is straightforward for teams familiar with this approach, as it follows conventional application-building practices.
Weaknesses
- Complexity: As the application grows, it becomes increasingly difficult to understand and manage due to the large, intertwined codebase.
- Continuous Deployment Challenges: Implementing changes is complex and time-consuming because any modification can impact the entire tightly coupled system.
- Scalability: The inability to scale individual components independently limits the application’s flexibility in resource allocation and management.
- Technology Adoption Barriers: Introducing new technologies often necessitates rewriting substantial parts of the application, posing significant hurdles.
Use cases
- Small team. If you are a startup and your team is small, you may not need to deal with the complexity of the microservices architecture. A monolith can meet all your business needs so there is no emergency to follow the hype and start with microservices.
- A simple application. Small applications which do not demand much business logic, superior scalability, and flexibility work better with monolithic architectures.
- No microservices expertise. Microservices require profound expertise to work well and bring business value. If you want to start a microservices application from scratch with no technical expertise in it, most probably, it will not pay off.
- Quick launch. If you want to develop your application and launch it as soon as possible, a monolithic model is the best choice. It works well when you aim to spend less initially and validate your business idea.
Microservices Architecture
While a monolithic application is a single unified unit, a microservices architecture breaks it down into a collection of smaller independent units.
Within a microservices architecture, the entire functionality is split up into independently deployable modules which communicate with each other through defined methods called APIs (Each service covers its own scope and can be updated, deployed, and scaled independently.
Event-driven architecture and microservices architecture are not the same but are complementary. Microservices focus on decomposing applications into independent services, while event-driven architecture emphasizes asynchronous communication through events. Together, they can enhance the scalability, responsiveness, and flexibility of modern applications. Below 2 points are how they complement each other:
- Combining EDA with Microservices: Microservices can use an event-driven architecture to communicate asynchronously, enhancing decoupling and scalability.
- Event Brokers: Microservices can publish events to an event broker, and other services can subscribe to these events to perform related tasks.
Strengths
- Independent components. Firstly, all the services can be deployed and updated independently, which gives more flexibility. Secondly, a bug in one microservice has an impact only on a particular service and does not influence the entire application. Also, it is much easier to add new features to a microservice application than a monolithic one.
- Easier understanding. Split up into smaller and simpler components, a microservice application is easier to understand and manage. You just concentrate on a specific service that is related to a business goal you have.
- Better scalability. Another advantage of the microservices approach is that each element can be scaled independently. So the entire process is more cost- and time-effective than with monoliths when the whole application has to be scaled even if there is no need in it. In addition, every monolith has limits in terms of scalability, so the more users you acquire, the more problems you have with your monolith. Therefore, many companies, end up rebuilding their monolithic architectures.
Weaknesses
- Extra complexity. Since a microservices architecture is a distributed system, you have to choose and set up the connections between all the modules and databases. Also, as long as such an application includes independent services, all of them have to be deployed independently.
- System distribution. A microservices architecture is a complex system of multiple modules and databases so all the connections have to be handled carefully.
- Cross-cutting concerns. When creating a microservices application, you will have to deal with a number of cross-cutting concerns. They include externalized configuration, logging, metrics, health checks, and others.
- Testing. A multitude of independently deployable components makes testing a microservices-based solution much harder.
Use cases
- Microservices expertise. Without proper skills and knowledge, building a microservice application is extremely risky. Still, just having the architecture knowledge is not enough. You need to have DevOps and Containers experts since the concepts are tightly coupled with microservices. Also, domain modelling expertise is a must. Dealing with microservices means splitting the system into separate functionalities and dividing responsibilities.
- A complex and scalable application. The microservices architecture will make scaling and adding new capabilities to your application much easier. So if you plan to develop a large application with multiple modules and user journeys, a microservice pattern would be the best way to handle it.
- Enough engineering skills. Since a microservice project comprises multiple teams responsible for multiple services, you need to have enough resources to handle all the processes.
Decomposition patterns to break down monolithic applications
Before you begin the decomposition process, you should evaluate which monoliths to decompose, and make sure to include those with reliability or performance issues, or those that include multiple components in a tightly coupled architecture.
AWS has a blog post to discuss the following four cloud-native patterns that are used to decompose monoliths, and describes the advantages and disadvantages of each one:
- Decompose by business capability
- A business capability is what a business does to generate value (for example, sales, customer service, or marketing). Typically, an organization has multiple business capabilities and these vary by sector or industry.
- Use this pattern if your team has enough insight into your organization's business units and you have subject matter experts (SMEs) for each business unit.
- Decompose by subdomain
- This approach breaks down the organization’s domain model into separate subdomains that are labeled as core (a key differentiator for the business), supporting (possibly related to business but not a differentiator), or generic (not business-specific).
- Decompose by transactions
- In a distributed system, an application typically needs to call multiple microservices to complete one business transaction. To avoid latency issues or two-phase commit problems, you can group your microservices based on transactions.
- Service per team pattern
- Each team is responsible for a business capability and owns the capability's code base. The team independently develops, tests, deploys, or scales its services, and primarily interacts with other teams to negotiate APIs.
Summary
Adopting a microservices architecture is not a one-size-fits-all approach. Despite being less and less popular, a monolith has its strong and durable advantages which work better for many use cases.
If your business idea is fresh and you want to validate it, you should start with a monolith. With a small engineering team aiming to develop a simple and lightweight application, there is no need to implement microservices. This way, a monolithic application will be much easier to build, make changes, deploy, and provide testing.
Although a monolith can be a valid option for some use cases, it is typically not suitable for a modern application. The poorly defined internal structures of a monolith can make it difficult to maintain code, which creates a steep learning curve for new developers and causes additional support costs. High coupling and low cohesion can significantly increase the time it takes to add new features, and you might be unable to scale individual components based on traffic patterns. Monoliths also require multiple teams to coordinate for one large release, which increases the collaboration and knowledge transfer burden. Finally, you can find that adding new features or building new user experiences becomes difficult when your business grows or user numbers increase.
The microservices architecture is more beneficial for complex and evolving applications. It offers effective solutions for handling a complicated system of different functions and services within one application. Microservices are ideal when it comes to the platforms covering many user journeys and workflows. But without proper microservices expertise, applying this model would be impossible.