Reviewed: November 2012
I’m not exactly sure how I came across this book; it had a good reputation on the grapevine and I appeared to be spending more time working on distributed systems, so seemed a suitable choice.
As Michael states in the preface, this is a book for architects, designers and developers working on enterprise-class systems. In essence the focus is on server-based and back-end systems – not desktop apps. The book is split into 4 parts: Stability, Capacity, General Design Issues and Operations with the first two parts taking a pattern language approach, whilst the latter two are more of a collection of loosely related topics.
The first two parts both start with a 10-page case study that sets the scene for the collection of patterns and anti-patterns that follow. Besides providing a back-drop for the pattern language the case study includes an attempt to put a real cost to the business on the failures in question. This provides a sobering thought that only goes to highlight how important the subject matter really is. There are also numerous side-bars throughout the book that take a far more technical look at the issues in question, such as capturing network packets.
Specifying timeouts was already on my list of essentials, but now the terms Circuit Breaker and Bulkhead also seem to be part of my regular vernacular. The key message from the Stability chapters is about de-coupling the various parts system whereas the Capacity section is about being careful with pooling and caching. The anti-patterns in the Capacity part have a definite web bias but I suspect that’s just because there are so many more different ways to host your servers.
The grab-bag of topics covered under General Design Issues includes multi-homed servers, clustering and configuration files – all interesting stuff. This leads on to the final part on Operations. Once again Michael takes a few pages to recount a story before heading into discussions around log file formats and various forms of monitoring. Chapter 18 concludes the book by proposing how to adopt a more agile approach to development so that systems will be able to mature and grow in ways that seek to minimise the chances of the anti-patterns rearing their ugly heads.