If there is a choice between processing a message synchronously or asynchronously, then I would always choose synchronously because it always makes the application simpler with fewer components parts, the code is easier to understand, tests are easier to write, and the system is easier to debug.
Asynchronous processing should be a design decision that is driven by need, be that the requirement for decoupling, scale, batch processing, or time-based processing. Event-driven systems give an ability to scale at much higher levels than monolithic systems, and the reason for that is that because of the loose coupling, the code scales horizontally with both greater granularity and greater effectiveness.
Another problem with asynchronous processing is the additional burden it adds to your operations. We need to create infrastructure for message queuing and message delivery, and this infrastructure needs to be monitored and managed, even if...