From 1612c31f35a0c81700e2d3535c90d5373ffe8b15 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Wed, 4 Jul 2018 16:59:52 +0200 Subject: [PATCH 1/2] Added configuration for multiple buses --- messenger/multiple-buses.rst | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 messenger/multiple-buses.rst diff --git a/messenger/multiple-buses.rst b/messenger/multiple-buses.rst new file mode 100644 index 00000000000..9fdb7a655ff --- /dev/null +++ b/messenger/multiple-buses.rst @@ -0,0 +1,34 @@ +.. index:: + single: Messenger; Multiple buses + +Multiple Buses +============== + +.. configuration-block:: + + .. code-block:: yaml + + framework: + messenger: + transports: + default: enqueue://default + default_bus: messenger.bus.command + buses: + messenger.bus.command: + middleware: + #- messenger.middleware.exactly_one_handler + - messenger.middleware.validation + - messenger.middleware.handles_recorded_messages: ['@messenger.bus.event'] + - doctrine_transaction_middleware: ['default'] + messenger.bus.query: + middleware: + #- messenger.middleware.exactly_one_handler + - messenger.middleware.validation + messenger.bus.event: + middleware: + - messenger.middleware.allow_no_handler + - messenger.middleware.validation + + routing: + # Route your messages to the transports + # 'App\Message\YourMessage': amqp From ff8c3d97e39789bfdb9150afc35913130cfe26d6 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Wed, 4 Jul 2018 17:17:58 +0200 Subject: [PATCH 2/2] Added some more content --- messenger/multiple-buses.rst | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/messenger/multiple-buses.rst b/messenger/multiple-buses.rst index 9fdb7a655ff..2cf010995c2 100644 --- a/messenger/multiple-buses.rst +++ b/messenger/multiple-buses.rst @@ -4,31 +4,38 @@ Multiple Buses ============== +A common architecture when building application is to separate commands from +queries. Commands are actions that do something and queries fetches data. This +is called CQRS (Command Query Responsibility Segregation). See Martin Fowler's +`article about CQRS`_ to learn more. This architecture could be used together +with the messenger component by defining multiple buses. + +A **command bus** is a little different form a **query bus**. As example, +command buses must not return anything and query buses are rarely asynchronous. +You can configure these buses and their rules by using middlewares. + +It might also be a good idea to separate actions from reactions by introducing +an **event bus**. The event bus could have zero or more subscribers. + .. configuration-block:: .. code-block:: yaml framework: messenger: - transports: - default: enqueue://default default_bus: messenger.bus.command buses: messenger.bus.command: middleware: - #- messenger.middleware.exactly_one_handler - messenger.middleware.validation - messenger.middleware.handles_recorded_messages: ['@messenger.bus.event'] - doctrine_transaction_middleware: ['default'] messenger.bus.query: middleware: - #- messenger.middleware.exactly_one_handler - messenger.middleware.validation messenger.bus.event: middleware: - messenger.middleware.allow_no_handler - messenger.middleware.validation - routing: - # Route your messages to the transports - # 'App\Message\YourMessage': amqp +.. _article about CQRS: https://martinfowler.com/bliki/CQRS.html