Monoliths vs Microservices vs Serverless
Tags: architecture, aws, beginners, devops
Published: 2022-11-26 16:08:12

## **Introduction**

When we are building a small-scale or large-scale applications, there are many different ways to go about it. While there is no "right" way to do things, I think it's useful to know the tradeoffs that each option presents. That way you can make an informed decision about which approach would be best for your particular use case. 
In this post I'm going to compare monoliths architecture, microservices architecture and serverless architecture.
At the end of the article. I am sure you would then be able to decide which architecture is the most appropriate for your on-going or future projects.
## **Monolithic Architecture**
Monolith applications are all-in-one apps.

A monolith application is an all-in-one app. It typically has all the features in a single codebase written in a single programming language and technology stack. For example, if you were building an online store for selling t-shirts, you might have one application that handles checkout, payments, inventory management and updating orders.

Monolith applications are easier to build and deploy because they’re made up of fewer components than microservices. However, this simplicity comes at the cost of having more complex interactions between these components which can make it difficult to scale them as your business grows or adapts to changing requirements (for example when new features are added).

Monolith applications are not always a bad thing. For simple applications, they can be ideal. In fact, in the early days of software development there was no such thing as microservices. Our first computers were monolithic machines that could only perform one task at a time (think calculators). When we started using personal computers and eventually mobile devices, our computing power dramatically increased but we still had only one application running on our machine at once—the OS itself was still monolithic in nature.

**Monolithic-Architecture-Diagram**![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9jf2w448vgnued8pt23.png)         

Monoliths have their place but they might not be ideal for every application you build today or tomorrow. For example:

If your app has lots of data associated with each user record and you run into performance issues with large datasets from too many database queries being executed too quickly (this is called "queries per second"), then breaking up your user records into separate entities that can be queried individually might help address those problems by reducing how many queries are performed against each database table's rows at any given time...

Monoliths are ok for some applications, but for more complex systems you may want to go ahead and break it down into microservices.


### **The advantages include:**
**1.Evolution of applications is simple**
From a business logic standpoint, the application really has no restrictions. It is already there if you require certain data for a new functionality.

**2.Customizations and overarching concerns are only utilized once**
Cross-cutting issues should only be handled once. For instance, setting up a data source connection pool, choosing and configuring Tomcat parameters, security, logging, managing exceptions, monitoring, etc.

**3.Ease of integrating new team members**
One location houses all of the source code. New team members can quickly become familiar with the application and debug certain functional flow.

**4.Early on in the application, costs are low**
One deployment unit, containing all of the source code, is created, packed, and deployed. What could be simpler? Infrastructure or development if you need any.

**5.Ease of development**
One common method of creating apps is the monolithic approach. No other information is needed. There is a central location for all the source code that makes it easy to understand.

**6.Debugging is easy**
Since all of the code is in one location, debugging is easy. Finding an issue by following a request's flow is simple.

**7.Testing simplicity**
You test a single service independently of any dependencies. Usually, everything is obvious.

**8.Deployment simplicity**
It is recommended to deploy just one deployment unit (such a jar file). There aren't any reliance. There are no breaking changes when the UI is packed with the backend code. Everything is located in one area and changes there.

Once the application is successful, monolithic architecture issues start to show up. The growth of the application is the very straightforward cause of this. The following reasons are often why a monolithic application transforms into another after some time.

### **The disadvantages include:**
**1.Tight coupling between services (interdependencies)** 
If you change something in one service, it could break another service’s functionality because they were tightly coupled together without any abstraction layers in between them (e.g., no interfaces between them).

**2.Code ownership is inapplicable**
The structure is expanding. The logical next step is to distribute duties among various teams. For instance, one team could concentrate on flight service while another would work on billing service. There are no distinctions between those services, though. Teams can influence one another.

**3.Problems with performance**
In the event of a performance problem, you may be able to scale the entire monolithic service. But what about the database? All services rely on a single database. You can begin by optimizing your database queries or by using read replicas. This type of optimization, however, has a limit.

**4.Infrastructure costs money** 
In cases of poor performance, you should scale the entire monolithic service. It adds to the cost of application operability.

**5.Technologies from the past**
Assume your application is written in Node.js 11.2.0 How long will it take to migrate the entire monolith with multiple services underneath to Node.js 18.0.0? What should be done with the tasks required to add new functionality? It is possible that the application will never be migrated.

**6.Lack of adaptability**
When you use Monolithic Architecture, you are limited to the technologies that are used within your monolith. Other tools cannot be used, even if they are better suited to the problem at hand.

**7.There are deployment issues**
Even minor changes necessitate the redeployment of the entire monolith.


## **Microservices Architecture**
Microservices are all-in-one apps that have been broken down into smaller chunks.

Microservices are architectural pattern that arranges an application as a collection of loosely-coupled, fine-grained services, communicating through lightweight protocols. This is different from a monolith, which is an application written in one language and operated together as one unit of code.

Microservices architecture is a contemporary approach to developing software applications from a collection of individual modules (services). Each service is typically focused on a single task (payment, shipping, etc.) or business function and can be built using a unique set of technologies.

This provides agility for both the engineering teams and the business as a whole. Microservices-based applications, for example, are easier to scale. Individual services are frequently quicker to develop and deploy than monolithic applications. And the benefits of microservices don't stop there.

**Microservices-Architecture-Diagram**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f5yc0y5fmo3jgqrovk2v.png)               

Companies using Microservices
There are many companies using Microservices for their products and services and here is a list of a few who shared their experiences. They are :
Comcast Cable, Uber, Netflix, Amazon, eBay, Sound Cloud, Karma, Microsoft, Groupon, Hailo, Gilt, Zalando, Lending Club, AutoScout24 etc

Let's dig deeper into these and other advantages of microservices. You'll see how this approach helps businesses build long-lasting, high-performance applications, reduce time to market, and effectively adapt to change.

### **The advantages include:**
**1.Microservices are easier to test**
You can test and change smaller pieces of a system, you can test a microservice without having to test the whole system. You don't have to bring up all of your instances just so that you can run some tests on one small piece. You also don't have to worry about breaking the rest of your application when trying out new functionality or fixing bugs in an individual microservice. 
This makes it much easier for developers since they can focus on their own part of the project without being concerned with how it will affect other parts of the project or whether something else might break because they're touching it at all.

**2.You can reuse code and build up libraries of functionality with microservices**
You can reuse code between microservices, and build up libraries of functionality that can be shared between services. This means you can build out highly specialized functionality for a single service, and then use that same code in other places. 
This is why people like to talk about "monoliths" as being monolithic—they're so big it's hard to change them, and because they're so big it's hard to break them apart into smaller pieces.

**3.You can move faster as a company with microservices**
The microservices approach allows you to focus on one thing at a time. It lets you use more people and more tools, making it easier to move fast without sacrificing quality.
Microservices allow you to be more agile, flexible, and iterate quickly because they're modular by nature. Each service has its own codebase, which makes them easy to update or replace if necessary.

**4.Development time and cost were reduced**
Despite the significant costs associated with establishing an agile team and microservices infrastructure, this approach is widely recognized as a significant source of savings, particularly in the long run. We've already mentioned several advantages that have a direct impact on the bottom line: faster time to market, lower costs for upgrading and scaling the system, and so on.
Furthermore, the adaptability of microservices has an impact on team structure. It enables the use of the dedicated team model to create agile teams – both in-house and remote – responsible for specific modules or business functions. These teams can collaborate in parallel, increasing productivity and delivery speed.

**5.Each module is deployed independently**
Microservices can be deployed independently in any application because they are separate modules. If any module is changed, the entire application does not need to be rebuilt and deployed.
Smaller codebases result in easier and faster deployment. This is due to the fact that there are fewer dependencies to manage within the services.
Continuous deployment is also made possible by the independent deployment of individual services. As a result, the software is always up to date for users.

### **The disadvantages include:**
**1.Increasing complexity**
API-driven service-oriented architecture has many structural parts. Therefore, it takes more resources to support the system and keep it running. It may also require a more complex testing strategy as services have little in common and require individual testing and debugging.
Despite these challenges, multiple advantages of microservices as well as real-world experience and proven bottom-line benefits encourage companies to shift towards microservices and further invest in this approach.

**2.Global testing and debugging is challenging**
When compared to microservice-based software, testing a monolithic application is significantly easier. All that remains is for us to launch our app and ensure and test its connection to the underlying database.
Each service in a microservices-based application must be launched and tested separately first. After all of the services have been launched, the application as a whole must be tested again.

**3.Not suitable for small applications**
Microservices architecture is an excellent choice for larger applications. However, for smaller apps, it will most likely be more time consuming and difficult to implement. 

**4.Microservices Can Pose Security Risks**
Microservices pose significant security challenges when compared to monolithic applications due to the significant increase in the volume of data exchanged between modules, because you're using multiple small containers, you're exposing more of your system to the network, which means more of your order is vulnerable to potential attackers.

It's also worth noting that because containers are highly replicable, a flaw in one module can quickly escalate into a larger issue. The source code is frequently used across multiple applications, providing hackers with easy access.
As a result, if the proper tools and training are not used, microservices can quickly become a security nightmare.

## **Serverless Architecture**
Your application runs on a server not managed by you

Without needing to manage infrastructure, applications and services can be created and run using serverless architecture. Although your application continues to operate on servers, Your cloud provider(AWS, GCP, AZURE etc) handles all server administration. To run your apps, databases, and storage systems, you no longer need to provision, scale, and maintain servers.
Users can interface with applications and access their business logic through servers, but administering servers requires a significant amount of time and resources. Teams must keep up with server hardware maintenance, software and security updates, and backup creation. Developers can now concentrate on building application code by offloading these duties to a third-party supplier by implementing serverless architecture.

Serverless architecture has been around for more than a decade, 
Amazon introduced the first mainstream FaaS platform, AWS Lambda, in 2014. Currently, a majority of developers still use AWS Lambda to build serverless applications, but Google and Microsoft have their own FaaS offerings as well, called Google Cloud Functions (GCF) and Azure Functions respectively.

**Serverless-Architecture-Diagram**![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kmffvmfysnqfzz1uenzi.png)

When developing online applications, there are very few use cases where Serverless Architectures are not a possibility. Everything has to do with the accessibility and development of managed cloud services. Many businesses even use a hybrid strategy, where they develop as much Serverless as they can and use other technologies to fill in the gaps.

## **Advantages of using Serverless Architecture**
**1.Cost**
You only pay for the requests that are made, so you aren't paying for servers or virtual machines that aren't being used.

**2.Scalability**
Within the confines of concurrency constraints, function instances are automatically added to or withdrawn in response to fluctuations in traffic.

**3.Productivity**
With serverless, engineers can easily release their code without having to manage any servers, which speeds up delivery times and allows businesses to grow quickly.

## **Disadvantages of using Serverless Architecture**
**1.Defeat of Control**
You have no control over the software stack that your code uses in serverless settings. You must rely on a cloud provider to resolve any problems that affect one of your servers due to hardware failure, data center outage, or other problems.

**2.Security**
A cloud provider might run code from a few of its clients simultaneously on the same server. Your application data may be exposed if the shared server is improperly setup.

**3.Vendor Lock-In** 
Big cloud providers like AWS provide a variety of services, including APIs, messaging queues, and databases, which can all be used together to build serverless applications. Although components from several vendors can be combined, services from a single provider are made to integrate most easily.

**4.Impact on Performance**
When functions are called after an extended period of inactivity, cold starts, which are frequent in serverless setups, cause code execution to pause for many seconds.

**5.Testing**
Unit tests may be conducted on function code by developers, but integration tests, which assess how frontend and backend components interact, are challenging to execute.

### **Conclusion**
Monolithic architecture is ideal for small applications due to its rapid development, ease of testing and debugging, and low cost. However, as the system grows, it may become an impediment to business and should evolve into a different form.

As you can see, there are numerous benefits to using microservices. They enable you to create more modular and maintainable applications, with less risk of breaking things when you make changes. They also provide your team with more flexibility in how they collaborate on a project, making it easier for them to be productive at all levels of experience—from junior developers to those who have been working with these types of systems for years.

Serverless defines the internal structure of the program, whereas Microservices refers to how to build your application at a macro level. A serverless application may or may not adhere to the concepts of microservices (although this is frequently the suggested course of action). All, some, or none of the micro services in a microservices architecture may be created utilizing serverless technology.

Serverless is a terrific tool for businesses looking to speed up time to market and create scalable, lightweight apps. But Microservices can be a better option if your apps use a lot of continuously running, lengthy tasks. In a hybrid architecture, developers might use Microservices to handle the majority of requests but delegate some quick-turnaround jobs, such database storage, to serverless activities.

Thanks for reading, I will love to know which architecture you are currently using or plan to use and why you choose it. You can put those in the comment box.

All the best. ✨