Foundations of Scalable Systems: Designing Distributed Architectures