When considering approaches to migrating or modernising legacy applications to a more modern architecture, the use of microservices is usually the first strategy that springs to mind. In most scenarios, this instinct is correct. However, this strategy should not be adopted without understanding some of the potential drawbacks of microservices; in this way, even if the decision is to proceed along the microservices route, mitigation strategies for their drawbacks can be adopted and the overall task therefore made a lot less stressful.
In the current era of containerization and cloud computing, monolithic systems fail to meet the mark.
Software systems are growing in complexity. Building and maintaining monolithic systems is becoming increasingly difficult.
In a monolithic system, all the components of the system are designed and packed into one single unit. Any change to a single component would need the entire system to be redeployed. This makes it difficult to scale and less flexible as well.
Microservice architecture is a software development style that breaks the system down into smaller independent components. It is a collection of autonomous services designed around a single business domain.
These individual units are capable of handling one part of the functionality of the software.
But with any system/architecture, microservices, too, has its share of pros as well as cons.
Pros of Microservices
Implementing the microservice architecture simplifies the software development procedure. It also makes it easier to maintain the software in the long run. Here are some of the pros of using microservice architecture:
Scaling up becomes easier
In the microservices architecture each service is designed, developed, and deployed independently. So, if one part of the software needs to be updated, we can update and use the microservice that handles that functionality.
Here in the entire system need not be taken down and deployed again. This enables a seamless update process and functioning of the software system.
Leads to Improved Fault Tolerance
Large applications that have multiple services installed within have better fault tolerance towards the failure of any one module.
Applications within microservices could continue working even if one service fails. This is because of the loose coupling between the services. Failure of one microservice does not affect the working of others.
Ease of understanding of the codebase of the software system
As one module has one responsibility encapsulated within, it becomes easier to understand the code base for that module.
It is easier to design a module keeping in mind the functionality of only that module. Understanding the specific functionality of each module is relatively more straightforward.
Gives you scope for experimenting with different technologies
Developers have the flexibility to experiment with different technologies while creating various services.
There are lesser technology dependencies between the modules. Rolling back to the previous iterations is less complicated.
Independent Deployment of each module
Since microservices are separate modules, they can be deployed independently in any application. If any module is modified, then the entire application need not be rebuilt and deployed.
Smaller codebases mean easier and quicker deployment. This is because there are lesser dependencies to take care of within the services.
Independent deployment of individual services also makes continuous deployment possible. Thus ensuring that the software stays updated for users at all times.
Cons of Microservices
As with any system, microservices have certain drawbacks as well. The cons are similar to the ones that are faced with distributed systems. The following are a few of the issues faced while adopting this architecture:
Increased Complexity of Communication Between the Services
Splitting an application into multiple smaller modules increases the
communication overhead. Developers have to be extra cautious while handling requests between the different modules.
The way different systems communicate could vary, and there might be a need for an interpreter. This can increase the complexity of deploying the entire system at once.
Requires More Resources
With an increasing number of microservices, the resources needed to implement them increases as well.
Multiple databases and logs would need to be maintained. Transaction management between the services would increase the overhead of maintaining the records.
Global Testing and Debugging is Difficult
Testing a monolithic application is considerably simpler as compared to a microservice-based software. We just need to launch our app and ensure and test its connectivity with the underlying database.
With microservices-based applications, each service needs to be launched and tested individually first. Then the application as a whole needs to be tested again, once all the services are launched.
Not Practical for Small Applications
Microservices architecture is a good option for bigger applications. But, for smaller apps, it will probably be more time consuming and challenging to implement.
The deployment could be a complicated and challenging procedure. It would need coordination between multiple services during deployment. It would not be as simple as deploying a WAR file in a container.
All in all, we have a clear picture of microservices. Microservices have clear advantages over monolithic systems.
However, they do have some cons as well. The disadvantages are mainly based on how you are using it.
Microservices are apt for large applications that have heavy dependencies. Monolithic systems are still a better option for smaller, less complex, and easy to debug applications.