Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services