Asynchronous Message Bus (Gateways)

Asynchronous Message Buses let you make an entire Command or Event Bus asynchronous with a single configuration change, instead of annotating every handler individually.

You'll know you need this when:

  • Your entire application should process commands in the background, not just individual handlers

  • You're building a write API that accepts commands and queues all of them for async processing

  • Adding #[Asynchronous] to every handler individually has become repetitive

  • You need an Outbox pattern where events are committed as part of the same database transaction

circle-check

Asynchronous Gateways

To make Gateway Asynchronous we will use Asynchronous Attribute, just like with Asynchronous Message Handlers. We may can extend any types of Gateways: Command/Event/Query Buses, Business Interfaces or custom Gateways.

To build for example a CommandBus which will send Messages over async channel, we will simply extend a CommandBus interface, and add our method.

#[Asynchronous("async")]
interface AsynchronousCommandBus extends CommandBus
{

}

then we all Commands that will be triggered via AsynchronousCommandBus will go over async channel.

circle-check

Having asynchronous CommandBus is especially useful, if given Message Handler is not meant be executed asynchronous by default.

then when using standard CommandBus above Command Handler will be executed synchronous, when using AsynchronousCommandBus it will be done asynchronously.

Outbox Event Bus

It's easy to build an Outbox pattern using this Asynchronous Gateways. Just make use of Dbal Message Channel to push Messages over Database Channel.

and then register dbal channel

Then whenever we will send Events within Command Handler (which is wrapped in transaction by default while using Dbal Module). Messages will be commited as part of same transaction.

Last updated

Was this helpful?