Behind the Cloud – Summarising Microservice Architecture
This month all of our social media activity has focused around a single topic, and that is the cloud. Last week on the blog we shared a brief introduction into the world of cloud computing, this week Nick, our in-house expert on cloud technologies, has put together a nice summary of the Micro-service Architecture that helps us build scalable applications for the cloud.
Over the last 10 years, there has been a significant change in the way that we consume Applications, and the value attached to these services being available 24 hours a day. People have become reliant on Websites and Phone Apps to carry out everyday tasks such as booking a train ticket, or paying their bills, so it is no longer acceptable for these services to be offline.
Historically, websites tended to be large monolithic applications that accessed database management systems provided by vendors such as Oracle, or IBM and required a team of Database Administrators (DBAs) to develop and maintain the database. This meant that you would have to wait for the database design to be signed off, before the application developers could complete work on the application, and deploy it to an application server following testing.
In addition to the potential for disconnect between database and application development teams, monolithic applications also create issues for testing, deployment and scaleability. These issues are typically handled using a hardware pattern whereby multiple servers accept connections via a load-balancer to allow servers to be taken offline for maintenance, and servers added to provide additional capacity.
Deploying a large application to physical servers is costly, both in hardware cost and integration testing, and often results in computing resources that are largely unused apart from at peak times. With the emergence of Virtualisation and Cloud Services in data centres, servers and storage can be configured on demand, on a pay per use basis, which has driven a change in application architecture and deployment.
Micro-service Architecture is an evolution of Service-Oriented Architecture (SOA) which decomposes a system as a collection of reusable services connected over a common communications protocol such as HTTP / REST. The monolithic application discussed earlier could be decomposed as follows:
Development is typically carried out by small Agile multidisciplinary teams that encompass Business Administration, Application Development, Database Design, Data Analysis and DevOps which helps to ensure that tested code can be deployed the same day. This does pose the question however, how do we manage deployment, what if the new services don’t integrate, and how does this help us scale our Web Application?
Scaleability and Kubernates
Cloud platforms allow us to quickly deploy and manage multiple nodes, which is useful for applications such as ticket sales where you want to maximise capacity at times when demand is high. Attempting to manually deploy and manage 10,000 nodes and then scale back to 10 would be extremely difficult, so we need to automate this process.
Microservice Frameworks such as Kubernates, allow us to automate deployment and management of services in Docker containers, which allows additional services to be deployed as required, and faulty services can to be rolled back to a previous version if necessary. The scaleability that this provides allows a Web Application such as an Online Store to run the minimum number of services overnight when demand is low to save costs on Cloud resources, and to scale out to the maximum number of services around Christmas or other peak times.
An Answer For Everything
There are of course some downsides to these patterns. It is often difficult to define service boundaries, and network latency can be significant when large numbers of services are deployed in an application. While Developer testing makes it is easy to test a service in isolation, Pre-Production and Production testing becomes more costly and complex due to the large number of interactions taking place.
Cloud Architectures such as Microservices allow us to deploy and scale applications in new ways that were not previously possible, however this won’t be suitable for all applications, such as those that service few requests and process relatively small amounts of data. We should be aware of the impact of these patterns on the structure of Software Teams, and the associated cost and difficulty of recruiting engineers with the required skill sets.