Monolithic apps can get large. Very large. And the more functionality you add, the more complexity is introduced between the interconnected parts. The relationships between dependent workflows grow increasingly intricate, and it’s rare to be able to reuse part of one system, without using the entire structure. This makes things even more arduous and complex. So much so, that to maintain and manage a tightly coupled monolithic beast efficiently becomes somewhat untenable.
What's a microservice anyway?
The concept of shifting a monolithic build to a microservices architecture (where apps are decomposed to run in smaller workloads) has been around for a while. In his book ‘Building Microservices’, Sam Newman from ThoughtWorks describes microservices as the practice of ‘creating small, independently releasable components that communicate over a network and can be deployed into production by themselves’. Simply put, they’re lego-esque building blocks for creating software applications.
One of the aims of restructuring applications into smaller, comprehensible executables is to make running these components on separate containers possible. Using Docker containers, you can package these components into separate pools, giving you the ability to spin up and scale when needing to cope with the demand, and then drop when not needed to conserve server resources. The decoupling of components drastically impacts your ability to change or evolve the design of your architecture, creating a more flexible approach to building and maintaining highly scalable apps.
So what's in it for me?
When you think of the demands on large applications i.e. the need to scale to tens of thousands of users simultaneously while supporting multiple platforms and managing complex workflows, app owners need to be equipped with meeting user expectations. Here are some of the benefits to creating container-based microservices architectures:
Stability
Alongside keeping your code and configuration stable, adopting consistent development and repeatable container deployment practices gives you the ability to update workflows in a more agile manner without affecting your entire structure.
Scalability
With the flexibility of containers, much of the services consumed by your app are done on-demand. The cost-effectiveness of this elasticity means you only pay for what you use, when you need it. And everytime your architecture autoscales, it mirrors the same tried and tested operational context.
Resilience
By decoupling the various components that make up your app, you can isolate bugs and quickly determine points of failure to prevent unnecessary service degradation. Any containers that are impacted can be retired, and new servers spun-up to eliminate the risk of redundancy.
Flexibility
Decentralising architectural decision making means container deployments can be done independently. So when you make a change to a particular service, you can deploy this to production immediately, allowing it to be easily observable.
Competitiveness
From a business competitiveness perspective, you’re enabling your business to scale quickly - be it to support new market entry or to innovate within existing markets. Container-based microservices support polyglotic frameworks, which also helps you staff your team with devs who don't need to be tied to any specific framework.
On the surface, decoupling app components can appear to be a scary prospect, as you’re effectively creating more and more parts that are going to need to be managed. Taking on this sort of transformation initiative is of course going to be an initial challenge. The most commonly cited difficulties include how to maintain the consistency and credibility of data sources, eliminating latency of services over the communication network, and the complexity of service orchestration.
The good news is, there are many tools available to help developers with orchestration management. And as demand for container-based microservices continues, there are likely to be more and more players entering the market with their own value-added services. We launched Cloud 66 for Docker in January 2015, and as a tried and tested DevOps management solution for microservices orchestration, we're here to help ease you into that transition.