Microservice Architecture has been a hot topic in the software world for a while now. It has been seen and rendered as a solution to issues arising from monolithic applications. But does it hold true to this argument? What are the benefits and challenges of this architecture? I will be debunking the same in this blog to understand the relevance of Microservice architecture in the post-COVID world.
What exactly is Microservices Architecture?
Gartner defines a microservice as “ a service-oriented application component that is tightly scoped, strongly encapsulated, loosely coupled, independently deployable and independently scalable.”
However, architecture could be defined as a collection of small, individual autonomous services that are self-contained, programmed to implement a single business capability.
Microservices is a perspective to building a single application that essentially contains smaller and independent services that run their processes to achieve a predetermined business objective.
Microservices is a way of solving problems and putting systems together. There is not a single piece of software or hardware you buy to get microservices
According to IDC, by 2022, 90% of all apps will feature microservices architectures that improve the ability to design, debug, update, and leverage third-party code; 35% of all production apps will be cloud-native. The digital economy’s requirement to deliver high-quality applications at the speed of business drives the shift to “hyper agile apps” – highly modular, distributed, continuously updated, and leveraging cloud-native technologies such as containers and serverless computing. Combined with agile/DevOps approaches and methodologies, enterprises can dramatically accelerate their ability to push out digital innovation – at 50-100 times (or more) the frequency of traditional techniques.
Characteristics of Microservices Architecture
- Highly Cohesive Components / Tightly Scoped
It is essentially like using a Lego block to build something. Owing to its single responsibility principle, each component does one thing and does it well. Components are smaller, less complicated, and are autonomous so that:
a.) They can be changed/upgraded/replaced independently
b.) They have a simple interface that makes sense for their domain
- Organized around business capabilities
Service should have a well-defined focus around the business domain and associated bounded context. Even the Development team (rather a Fullstack Pod) should be structured as per business domain context. Teams with business context should have a product mindsetand should be designed for the full lifecycle of the product (requirement gathering to production support)
- Autonomous and Self Contained
Each autonomous service is self-contained, which means that they each have a business capability. Additionally, each service has a different codebase that makes it easier for it to be managed by a small team.
a.) Each microservices contain their own set of data.
b.) Each microservice should be independent and autonomous
c.) Each Microservice should support the ability to change, test, and release independently of the rest of the system
d.) Microservices follow Nothing Shared principle for their implementation. The only public/shared asset they have is their API or published Event in Event-Driven Architecture
- Design for Failure
Microservices must be designed to operate despite failure, maybe with Degraded Functionality or Default Functionality implementation. Some of the common patterns used to build Microservices for resiliency are:
b.) Circuit Breakers
c.) Redundancy – load balancer or competing consumer
d.) Brokered communication
e.) Detect failure – observability and Monitoring
f.) Test traffic
g.) Validation and defensive programming techniques
5. Smart endpoints, dumb pipes
a.) Microservice needs to own its interfaces with well-defined contracts.
b.) Microservice knows what data they take in and where they send data. They know what to do with errors and poison messages
c.) Microservices utilize contracts to other services, not integrations
- Infrastructure Automation
Infrastructure automation is required to support scaling and rapid response (e.g., adding more compute, deploying code, etc.) and required Monitoring and configuration management.
- Independently Scalable – even if one microservice handles the majority of traffic, we don’t need to scale the entire system but focus only on scaling the affected microservice instead.
- Independently deployable – it can be deployed separately without having to compromise other microservices.
Lastly, applications that rely on the microservices approach to communicate with one another using well-defined APIs or Event-Driven Architecture don’t necessarily require the same framework, libraries, or technology stack. Microservices are advantageous and useful for large and complex applications that require high scalability and shorter release cycles.
Guess what? All this can be challenging as you need to determine the backward compatibility of your implementation continuously.
Now, let’s deep dive further into the benefits and challenges of Microservices Architecture.
Benefits of Microservices Architecture
- Independent feature delivery
In a microservice architecture, multiple teams work in separate services, making deployment time much quicker, easier and cheaper.
a.) You can release any service independently from the others
b.) You don’t have need all teams for the massive release cycle
c.) Delayed releases don’t affect every component
d.) Using techniques like ‘Feature Flags’ feature plug and play, rolling upgrade scenarios are also possible.
In the microservices architecture, you can scale each service independently without having to scale the entire Application. Using Kubernetes/Service Fabric orchestrators, you can deploy a larger bulk of services onto a single host. This ensures that the resources are better utilized.
Owing to microservices being deployed independently, any update or feature delivery can be deployed separately without affecting the Application. Additionally, even if a feature delivery goes wrong for a single service, it can easily be called off without hampering the operations of the Application. The same can be assured in any other traditional systems of applications.
- Technology Diversity
Microservices enables you to use the right technology for each service. By design, the Microservices architecture can support Diverse Technologies’ use and thus sometimes allows teams to develop the functionality using the technology they feel most comfortable with.
Pro tip – While I agree that different requirements sometimes benefit from a different technology, I would not suggest using a diverse set of programming languages across Microservices projects in the given Business context.
- Lower Cognitive Load for developers
- Automated Testing
As Service endpoints are abstracted, it makes testing easier. Automated Deployment can be combined with Automated Test tools such as Continuous Testing.
- Small codebase
In a monolithic architecture, there is a high chance of code dependencies becoming entangled. This isn’t necessarily the case for microservice architecture as it does not allow for code sharing, therefore ensuring fewer dependencies overall. This architecture makes it easier to add in more features as well.
- Integration of DevOps
Once automation runs through the DevOps pipeline, it requires consistent testing at every release to ensure high-quality performance. The microservice architecture enables development teams to test even when things are still in production. Parallelly, DevOps monitors and oversees anomalies if detected and additionally renders necessary systems to issue fixes and rollback to previous versions if required.
Both microservices and DevOps work towards achieving an agile environment for any organization. When you combine the two, you can see the following benefits:
a.) It helps to empower small independent development teams
b.) Improves test cycle times
- Fault Isolation -> increased resilience
Microservices architecture ensures that your Application is entirely decentralized and decoupled. This means that there will be relatively minimal failures. Unlike monolithic architecture, wherein a code’s failure affects more than one service, each service acts as a separate entity, making maintenance simpler. It has resilience patterns such as bulkheads, circuit breakers, etc., that make isolating faults and anomalies easier.
Challenges of Microservices Architecture
Microservice Architecture isn’t necessarily free of shortcomings either. The process of developing a microservice architecture-based application is far more complicated than a monolithic one. It may seem more straightforward, but the execution and implementation may pose a challenge to companies. These include:
- Software Complexity: Microservices have multiple individual moving parts wherein each service may be more straightforward, but the whole architecture can be tricky. For instance, each service must be monitored, deployed, and orchestrated without affecting one another. It requires an able team that fully understands this broader architecture of the Application. It additionally requires a continuous verification process that oversees whether each microservice is working correctly or not.
Complexity is moved from the code to the environment. Developers don’t have to pay the price.
Though today most of this complexity can be handled with Infrastructure as Code and Desired Configuration State toolset.
- Interaction: With a microservices architecture, the applications are loosely coupled into independent microservices that communicate with each other. If Monolith, previously hidden dependencies were coded, now in the Microservice architecture, they would have to be reconfigured. This makes the overall infrastructure communication complex and challenging. You have to be careful about handling requests flowing between each service. In specific scenarios, developers may even have to write up a new and extra code to avoid disruption. Additionally, an in-memory call would now be a call that moves around different processes, adding potential latency and interrupt speed. Remote calling a microservice in a loop can effectively add latency to every loop iteration.
- Operation Complexities: In a microservice architecture, each microservice team has the autonomy to choose the right technology, the ways to deploy a service, etc., making the overall inter-operational processes and communication much more complicated.
- What about large or small companies? : Microservices Architecture can be excellent for large organizations; however, it can be complicated for small enterprises. Small enterprises wouldn’t want to get bogged down in complex orchestration if they intend to create simple applications.
- Difficulties in debugging problem: We have previously addressed the benefit of Microservices Architecture compared to Monolithic Architecture. A node failure can be easily isolated in the Microservices Architecture rather than the monolithic one, making maintenance relatively simpler. However, each set of services has its own set of logs to go through. It has been noted that 27% of the developers debug a problem using only logs, which in my opinion, is a bad idea. So, the question remains: is it straightforward with more logs?
- Extra Time Testing: In this heavily distributed architecture, testing service dependencies become a considerable challenge significantly when the Application is evolving quickly.
- Mindset challenges of Eventual Consistency of Data: Owing to the architecture’s decentralized data management, eventual inconsistency is inevitable. Business stakeholders and developers now have to get accustomed to the fact that inconsistencies may arise and that they’d have to spend some time to detect when things go out of sync. Most of the time, the Application needs to develop an additional complexity level to avoid issues and data inconsistency in the Business process and transaction.
- Versioning – Without a robust design, backward and forward compatibility may become an issue as multiple services could be updated at any time.
9. More Complicated Security System – A higher number of components means a higher risk of hackers’ attacks. The security team needs to handle various operating systems, languages, and frameworks to secure the whole system.
Some of the other notable challenges include:
a.) Complexity moves to Deployment
b.) Higher Cognitive Load for Architects
c.) Increased need for Monitoring
d.) Too much agile can make you rigid
An enterprise should use Microservice Architecture for a solution if it’s complex enough to outweigh the costs of maintaining and moving to a microservices-based architecture.
Is Microservices Architecture still relevant in the post-covid world?
“No Silver Bullet — Essence and Accidents of Software Engineering”
- Fred Brooks – 1986
Microservices, like every other Application Architecture, is going through a classic Gartner Hype Cycle. In July 2020, Gartner stated that Microservices are “falling into the trough of disillusionment,” and I fully agree with this assessment.
The relevance of the Microservices Architecture is decreasing with new and disruptive architectural solutions such as:
- Increased adoption of Low code/no-code platforms
The growing and accelerated digital transformation have bought this technological disruption into the picture. Business units increasingly control their application development efforts, of which citizen development will play a crucial role in the future of apps.
Low Code platform aims to bridge the gap between IT departments and companies by bringing enhanced performance and agility to the development process and lifecycle. Low code/No-code substitutes codes with a uniformed visual modeling environment in the software development process. Rather than writing long lines and syntaxes, you can build applications quickly using modern user interfaces (such as drag and drop), making it easier for anyone to develop an application. This reduces the complexities associated with traditional coding methods and invites anyone into the design and development process.
According to Gartner, 65% of the application development will be done through Low Code/No Code approach, and that the COVID-19 pandemic has only accelerated for this adoption. This emergent technology solves the problem of unpredictable market demands and ensures business continuity even during adversities.
The future of application strategy must include Citizen Development and the formation of Fusion Teams (Citizen Developer + Pro Developer).
2. Focused shifting to Serverless
Microservices have multiple codes written for a single service that could be reused or extracted to make it easier for developers to maintain consistency. Standard functionalities like logging, tracing, authentication, hosting of controllers, etc., could be moved to a ‘hosting microservice.’ This automated Deployment will oversee the execution of any request handling function and the scalability of that service. This essentially creates an ecosystem wherein developers can create and push the business functionalities into this said ecosystem. This is where ‘serverless’ comes into play as you do not need to create configurations or provision machines to a single service.
However, one shouldn’t misunderstand what ‘serverless’ means here. It doesn’t mean that you don’t require an actual server but instead requires one where you don’t necessarily have to manage it as it is done automatically. Serverless architecture removes this hassle of managing infrastructure. In essence, we will no longer have to shell out high architectural management costs by being serverless.
This is what ‘serverless’ would look like for your reference:
3. Demand shift to Intelligent Experience in existing apps
There is a shift in customer demand to provide a more adaptable AI-powered, Intelligent Experience inside the existing set of applications. Customers and employees increasingly expect more contextualized and personalized application experiences.
A shift is driven by demand for new Employee Experience (EX) and Customer experience (CX) instead of just reducing the Technology Debt with the latest platform runtime or faster time to develop. Integration of Artificial Intelligence is the new norm.
4. Shifting from complex apps to simple Activity-based apps
Businesses are no longer looking for complex solutions or complex apps. Transformation may seem like a strenuous task, but ultimately what’s being asked for right now is to simplify solutions. Instead of looking for the solution’s underlying technical and functional aspects, organizations are looking for specialized solutions for specific requirements. Hence, complex and rigid structures lose their relevance in today’s post-COVID world, as they can no longer be viable for particular needs or be managed efficiently.
5. Self Service Integration
The Applications of the future will be founded on Democratized, Self-Service Integration. In the future, development and integration will be combined to enable ubiquitous assembly of customized application experiences. Application leaders must invest in enterprise-grade, multi-function, and multi-persona integration to benefit from this vision for the future of applications.
There has been a definitive digital transformation induced by the COVID-19 pandemic, which decreased Microservices Architecture’s relevance. Owing to the reasons mentioned above, the architecture as a whole will probably cease to exist.
My guess? Microservices will kill Microservices. This means that the characteristics of independent components will remain and become a standard. However, the architecture as a whole will probably lose its relevance.
Additionally, Microservices have certain complexities that may arise at the beginning for organizations looking to adopt them. Hence, in my opinion, here are some pointers to keep in mind :
a.) For less complicated applications, monoliths are always better in both the long and short-run.
b.) For moderately complex applications, monoliths are still probably better in both the long and short-run
c.) For complex apps, microservices may pay off over time, but it takes a while to offset the high up-front investment required to do it
Microservices have certain benefits but also present their own unique set of challenges. For simple apps, activity-based apps, and Intelligent Experience apps, Microservices architecture will be ultimately dethroned by new architectural solutions or will be a standard for more complex systems only.