Contrary to popular beliefs, skills that apply to building applications on physical servers apply to building applications on the cloud.
Taking an on-premise application and deploying it on a Azure Virtual Machine should be straight forward. The majority of modifications required, include changing configurations in order to accommodate differences in the Virtual Machine’s configuration.
Going to the cloud on a single Virtual Machine is like crossing the ocean on a row boat. You’ll probably get there, but I can’t guarantee anything.
Once you’ve deployed your application to the cloud, things get interesting because you have opportunities that allow you to solidify your application.
If you are building your application on the Cloud instead of building your application for the Cloud, you’re doing it wrong!
Taking advantage of services offered on Azure allows you concentrate on creating value for your business. The Azure teams takes care of lots of boring stuff like disaster recovery. To me, building applications for the cloud is equivalent of going from a row boat to a fleet of navy destroyers. (Alright, I may be a little overconfident, but you get the picture.)
Preparing applications to go web scale isn’t a trivial task. Each application is unique and requires different services. You will need to go over your objectives and build accordingly.
Although the planning phase isn’t trivial, augmenting your applications with cloud services isn’t as complicated as some might think. The Azure teams provide an amazing amount of support materials like hands on labs, tutorials and a rich collection of documentation.
Throughout the planning phase of an application on the cloud there are a few architectural strategies that require some extra attention.
- Decompose the Application by Workload
- Establish a Lifecycle Model
- Establish an Availability Model and Plan
- Identify Failure Points and Failure Modes
- Resiliency Patterns and Considerations
- Design for Operations
Cloud Design Patterns
While designing or augmenting cloud based applications, the following patterns should be consider. While this list isn’t complete, it should be used as a starting point.
For more patterns, take a look at the resources listed at the bottom of this post.
- Cache-aside Pattern – This is a common technique that we can use to improve the performance and scalability of a cloud solution by temporarily copying frequently accessed data to fast storage located close to the application.
- Queue-based Load Leveling Pattern – Cloud solutions are submitted to very unpredictable loads and require protection against their own success. By placing queues between clients and the workers who execute tasks, you are protecting yourself against spikes.
- Competing Consumers Pattern – Enable multiple Cloud Service instances to retrieve messages from the same source.
- Compute Resource Consolidation Pattern – Consolidate multiple tasks or operations into a single computational unit (Roles, Virtual Machines, Web Sites).
- Eventual Consistency – Cloud solutions use data that’s dispersed and duplicated across data stores, managing and maintaining data consistency can become a major bottleneck.
- Leader Election Pattern – A great way to coordinate actions being performed by a group of Cloud Service instances is to elect a leader that can act as the coordinator. This is extremely useful for maintenance tasks and singleton tasks that need fallbacks.
- Materialized View Pattern – This has got to be one of my favorite cloud patterns. The solutions’ data may not be formatted in a way that favors our query requirements. In order to optimize our queries, it may be desirable to generate pre-populated views whose shapes correspond with our requirements.
- Pipes and Filters Pattern – We should strive to decompose complex tasks into a series of discrete elements that can be reused.
Succeeding on the cloud is all about architecture, using the right service for the right reasons. This can be a challenge because cloud platforms are continuously evolving. Azure is currently (Jan 2014) on a 3 week release cycle and it can be quite a challenge for all of us to keep up. Fortunately there are blogs, podcasts and online courses that help us along the way.
- What is Azure – going back to the basics
- The Official Azure Blog – keep up to date with the latest news
- Azure Documentation Center – get acquainted with Windows Azure
- The Official Azure Forums – get answers to your questions
- Windows Azure on StackOverflow – great community support
- Introducing Azure – great overview of the available services
- Learn how to design applications and implement common design patterns in Azure – essential knowledge for solution architects
- Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications – great patterns for developer and architects. Use these guidelines as a starting point.
- FailSafe: Building Scalable, Resilient Cloud Services – this series is essential and is a great way to ramp-up on what it means to build for the cloud.
- Episode 1 – FailSafe Core Concepts, Part I
- Episode 2 – FailSafe Core Concepts, Part II
- Episode 3 – Scalability and Deployment
- Episode 4 – Design for Operations
- Episode 5 – Platform and Connectivity Patterns
- Episode 6 – Design for Data
- Episode 7 – Design for Scalability
- Episode 8 – Design for Availability
- Episode 9 – Design for Manageability
- Building Real World Cloud Apps with Azure Part 1 – Great information directly from Scott Guthrie about what we should care about when we build for the cloud
- Building Real World Cloud Apps with Azure Part 2 – Great information directly from Scott Guthrie about solidifying your application for the cloud
- Everything Azure on Channel 9 – rich with hours of great content
- Azure Cloud Services Tutorials –a good place to start
- Cloud Architecture Patterns – this book by Bill Wilder enumerates the fundamental principles that should drive architectures for cloud solutions.
- Download Guthrie’s eBook “Building Real-World Cloud Apps with Azure”
- Patterns & practices Azure Guidance – A great collection of eBooks