The four fundamental architectural principles that separate cloud and legacy applications include: design for elasticity, design for infrastructure as code, design for unreliability, and design for platform services. Software architectures that fail to take advantage of one or more these principles are less likely to be effective cloud applications, and more likely to increase the ranks of future cloud dropouts.
Design For Elasticity
The dirty little secret of the cloud is that running cloud infrastructure is in general more expensive than running dedicated physical hardware. The primary economic advantage of cloud computing is consumption-based pricing, which is only effective if you have: a) moderate to substantial inefficiencies in your management of physical hardware, b) high infrastructure growth rates, or c) software that can take advantage of elasticity.
Taking advantage of elasticity requires adhering to design principles such as loosely coupled services, idempotency, asynchronous communication, infrastructure automation, and integrated intrumentation. Adhering to only some of these design principles yields a more rigid software architecture, not fully capable of exploiting the potential of elasticity.
Design For Infrastructure As Code
Most cloud applications are built on the principle that infrastructure is code. This results in efficiencies in developing, deploying and operationally supporting infrastructure that transform the traditional economics of software. It also results in architectures that emphasize software over hardware, effectively relying on virtual equivalent of commodity hardware. The investment in automation is also a core building block for scaling, elasticity, and the ability to leverage new cloud-based pricing mechanisms (e.g. auction-based pricing, reservation pricing).
Design For Unreliability
While pre and post-cloud architectures share many similarities, there is one area where they differ dramatically: their expectations toward failure. Pre-cloud architectures assume failure could occur; cloud architectures assume failure will occur. Amazon stated in its 2007 paper Dynamo: Amazon’s Highly Available Key-value Store that “customers should be able to view and add items to their shopping cart even if disks are failing, network routes are flapping, or data centers are being destroyed by tornados.”
In other words, the cloud architectures assume failure is the rule and not the exception; whereas most legacy applications are designed for reliable performance and physical proximity (e.g. consistently high disk IOPS, consistently low network latency). The result is the cloud is often an adverse computing environment for legacy applications.
Design For Platform Services
Cloud computing vendors have gradually moved from low-level compute and storage to application services such as databases, key-value stores, and object stores. While platform services are still in the early stages of maturation, these services offer core building blocks that can eliminate substantial software and operational complexity from your applications. Cloud architectures are becoming increasingly reliant on point vertical services that eliminate complexity while providing cost-effective platforms for future growth.
I wince every time I hear of someone migrating their legacy application to the cloud with no architectural changes. While we all know it can be done, I can’t help but to think it is creating a new generation of cloud dropouts that will soon be blogging on why they moved back to physical hardware (e.g. Mixpanel, Zynga). If you are going to the cloud, do so with eyes wide open, fully embracing the design principles required for successful performance, reliability and cost in the cloud.
Related Posts: Top 5 Challenges Migrating To a New Cloud