scaling challenges in distributed systems