Synchronous vs Asynchronous Communication: When to Use What?