From 751ede3810326b30a2a361e8c51caaaae9a5a76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 17 Sep 2024 17:00:39 +0300 Subject: [PATCH] Communication via Messages section added --- .../images/visual-studio-order-event.png | Bin 0 -> 14624 bytes docs/en/tutorials/modular-crm/part-06.md | 48 +++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 docs/en/tutorials/modular-crm/images/visual-studio-order-event.png diff --git a/docs/en/tutorials/modular-crm/images/visual-studio-order-event.png b/docs/en/tutorials/modular-crm/images/visual-studio-order-event.png new file mode 100644 index 0000000000000000000000000000000000000000..34dc3e717fabb4f73c549a3dc273d79ab5ad646b GIT binary patch literal 14624 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 > It is suggested to keep that type of communication minimum to not couple your modules to each other. It can make your solution complicated and may also decrease your system performance. When you need to do it, think about performance and try to make some optimizations. For example, if the Ordering module frequently needs to product data, you can use a kind of [cache layer](../../framework/fundamentals/caching.md), so it doesn't make frequent requests to the Products module. Especially, if you consider to convert your system to a microservice solution in the future, too many direct integration API calls can be a performance bottleneck. -## Asynchronous Communication via Events +## Communication via Messages (Events) + +Another common approach to communicate between modules is messaging. By publishing and handling messages, a module can perform operation when an event happens in another module. + +ABP provides two types of event buses for loosely coupled communication: + +* [Local Event Bus](https://abp.io/docs/latest/framework/infrastructure/event-bus/local) is suitable for in-process messaging. Since in a modular monolith, both of publisher and subscriber are in the same process, they can communicate in-process, without needing an external message broker. +* **[Distributed Event Bus](https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed)** is normal for inter-process messaging, like microservices, for publishing and subscribing to distributed events. However, ABP's distributed event bus works as local (in-process) by default (actually, it uses the Local Event Bus under the hood by default), unless you configure an external message broker. + +If you consider to convert your modular monolith to a microservice system later, it is best to use the Distributed Event Bus with default local/in-process implementation. It already supports database level transactional event execution and has no performance penalty. If you switch to an external provider (e.g. [RabbitMQ](../../framework/infrastructure/event-bus/distributed/rabbitmq.md) or [Kafka](../../framework/infrastructure/event-bus/distributed/kafka.md)), you don't need to change your application code. + +On the other hand, if you want to publish events and always subscribe in the same module, you should use the Local Event Bus. In that way, if you switch to microservices later, you don't accidently (and unnecessarily) make a local event distributed. Both of the event bus types can be used in the same system, just understand these and use them properly. + +Since we will use messaging (events) between different modules, we will use the distributed event bus. + +### Publishing an Event + +In the example scenario, we want to publish an event when a new order is placed. The Ordering module will publish the event since it knows when a new order is placed. The Products module will subscribe to that event and get notified when a new order is placed. It will decrease the stock count of the product that is related to the new order. The scenario is pretty simple, let's implement it. + +#### Defining the Event Class + +Open the `ModularCrm.Ordering` module in your IDE, find the `ModularCrm.Ordering.Contracts` project, create an `Events` folder and create an `OrderPlacedEto` class inside that folder. The final folder structure should be like that: + +![visual-studio-order-event](images/visual-studio-order-event.png) + +We've placed the `OrderPlacedEto` class inside the `ModularCrm.Ordering.Contracts` project since that project can be referenced and used by other modules without accessing internal implementation of the Ordering module. The `OrderPlacedEto` class definition should be the following: + +````csharp +using System; + +namespace ModularCrm.Ordering.Contracts.Events +{ + public class OrderPlacedEto + { + public string CustomerName { get; set; } + public Guid ProductId { get; set; } + } +} +```` + +`OrderPlacedEto` is very simple. It is a plain C# class and used to transfer data related to the event (*ETO* is an acronym for *Event Transfer Object*, a suggested naming convention, but not required). You can add more properties if it is needed. For this tutorial, it is more than enough. + +#### Using the `IDistributedEventBus` Service + +`IDistributedEventBus` service is used to publish events to the event bus. + +