Without one, each component would be responsible for creating and maintaining connections with the other components. A possible alternative approach would be to architect the system around a communication bus, but this would still leave each component in charge of message delivery issues. In the first example above, all that is required to increase server capacity is to add servers to the pool. The application itself doesn't have to be rearchitected. Likewise, when components fail the application degrades gracefully.
Communication is asynchronous.
Components can perform other tasks while not busy handling requests. They can either poll the message server when ready or receive notification via a callback when a message is waiting. It is unnecessary to wait in a loop. This is an important consideration in applications like those in the second example. The application is modular.