Building scalable systems for the cloud involves leveraging unique design patterns specific to cloud services. In Bill Wilder’s book, Cloud Architecture Patterns: Using Microsoft Azure, he walks through these patterns in detail with practical examples for Microsoft Azure. Although this book is now several years old, most of the patterns still hold up today.
Each chapter in the book covers either a primer, or a pattern. The primer chapters focus on systems design basics which include topics reviewing scalability, eventual consistency, multi-tenancy, and network latency. The pattern chapters focused on the actual design patterns. In the book Wilder covers the following:
- Horizontal Scaling for Compute Pattern
- Queue-Centric Workflow Pattern
- Auto-Scaling Pattern
- Map-Reduce Pattern
- Database Sharding Pattern
- Busy Signal Pattern
- Node Failure Pattern
- Colocate Pattern
- Valet Key Pattern
- CDN Pattern
- Multi-Site Deployment Pattern
For those working with cloud services on a daily basis: most of these will already feel familiar or obvious, but you will likely still pick up a few tips in several chapters. The definitions help formalize the patterns and when/why we use them. Several examples refer to Azure specific implementations, but the principles can equally apply to AWS or GCP.
I did appreciate the book’s focus on building cloud native applications. Wilder explains that these applications should:
- Leverage cloud platform services for reliable and scalable infrastructure (let the platform do the hard stuff).
- Use non-blocking asynchronous communication.
- Use automated, elastic, horizontal scaling (without downtime or UX degradation).
- Handle transient events without UX degradation.
- Handle node failures without downtime.
- Use geographic distribution to minimize latency.
- Allow the upgrade of code without downtime.
Cloud services change rapidly, so its not surprising that a few things have changed since the release of the book. First example is that the legacy Azure Cloud Service virtual machines referred to frequently are no longer recommended. Azure App Services, Functions, or other modern compute options would be preferred. Second example would be Microservices. Can’t blame the author here either as that pattern/trend hadn’t gained traction yet. Despite some of the now dated references I still picked up a few tips and enjoyed the read.