Dowiedz się, czy lepiej publikować Domain Event czy Integration Event. Poznaj różnice, zastosowania i praktyczne wskazówki w kontekście DDD i integracji systemów.
Czy lepiej publikować Domain Event czy Integration Event?
Domain Event i Integration Event to dwa kluczowe pojęcia w projektowaniu systemów opartych na zdarzeniach. Chociaż oba są używane do komunikacji między komponentami systemu, różnią się swoim przeznaczeniem, zakresem i sposobem użycia. W tym artykule wyjaśnię, czym się różnią, kiedy warto je stosować i dlaczego wybór odpowiedniego podejścia ma znaczenie dla Twojej architektury.
Czym są Domain Events?
Domain Events to zdarzenia odzwierciedlające zmiany w domenie biznesowej. Są one wynikiem operacji na modelu domenowym i opisują fakty, które już się wydarzyły.
class OrderPlaced {
constructor(
public readonly orderId: OrderId,
public readonly customerId: CustomerId,
public readonly items: OrderItem[]
) {}
}
Zdarzenie OrderPlaced
informuje, że zamówienie zostało złożone. Jest ono ściśle związane z logiką domenową i zazwyczaj nie zawiera szczegółów technicznych.
Domain Events służą do:
- Informowania innych części systemu o ważnych zdarzeniach biznesowych.
- Umożliwienia modelowi domenowemu zachowania spójności.
- Izolowania logiki biznesowej od szczegółów implementacyjnych.
Kiedy używać Domain Events?
Domain Events są idealne, gdy chcesz:
- Zachować spójność domeny i izolację logiki biznesowej.
- Modelować zdarzenia w sposób zgodny z językiem domenowym (Ubiquitous Language).
- Uniknąć nadmiernego powiązania między komponentami systemu.
class Order {
private events: OrderEvent[] = [];
placeOrder(customerId: customerId, items: OrderItem[]): void {
// Logika biznesowa
this.events.push(new OrderPlaced(this.id, customerId, items));
}
getEvents(): OrderEvent[] {
return this.events;
}
}
Czym są Integration Events?
Integration Events są używane do komunikacji między różnymi systemami lub modułami. Ich głównym celem jest integracja, a nie modelowanie domeny.
class OrderPlacedIntegrationEvent {
constructor(
public readonly orderId: string,
public readonly customerEmail: string,
public readonly shippingAddress: string
) {}
}
Chociaż to zdarzenie również odnosi się do zamówienia, zawiera szczegóły techniczne, które mogą być istotne dla zewnętrznych systemów, takich jak systemy wysyłkowe czy CRM.
Integration Events:
- Mają szerszy zakres niż Domain Events.
- Są projektowane z myślą o odbiorcach zewnętrznych.
- Zawierają dane potrzebne do integracji, często kosztem czystości modelu domenowego.
Kiedy używać Integration Events?
Integration Events sprawdzają się w scenariuszach, gdy:
- Musisz przesyłać dane do innych systemów (np. mikroserwisów).
- Zdarzenia wymagają wzbogacenia o szczegóły techniczne, np. adres wysyłki.
- Chcesz zapewnić asynchroniczną komunikację między różnymi modułami.
Kluczowe różnice
Cecha | Domain Events | Integration Events |
---|---|---|
Zakres | Ograniczony do logiki domenowej | Szerszy, obejmujący integrację |
Odbiorcy | Wewnętrzne komponenty systemu | Zewnętrzne systemy, bądź inne moduły systemu |
Zawartość | Minimalna, domenowa | Szczegółowa, techniczna |
Cel | Modelowanie domeny | Integracja |
Czy można łączyć oba podejścia?
Tak, w wielu przypadkach Domain Events mogą być i są używane jako źródło do generowania Integration Events. Na przykład:
- Model domenowy generuje
OrderPlaced
jako Domain Event. - Handler zdarzenia przekształca je w
OrderPlacedIntegrationEvent
i publikuje na zewnątrz.
class OrderPlacedHandler {
handle(event: OrderPlaced): void {
const integrationEvent = new OrderPlacedIntegrationEvent(
event.orderId,
"customer@example.com",
"123 Main St"
);
this.publishIntegrationEvent(integrationEvent);
}
private publishIntegrationEvent(event: OrderPlacedIntegrationEvent): void {
// Publikacja zdarzenia
}
}
Podsumowanie
Wybór między Domain Events a Integration Events zależy od kontekstu. Domain Events są kluczowe dla modelowania logiki domenowej i zachowania spójności. Integration Events natomiast są niezbędne w komunikacji między systemami. Warto pamiętać, że oba podejścia mogą współistnieć i wzajemnie się uzupełniać, tworząc solidną i elastyczną architekturę.
Jeśli chcesz, aby Twój system był skalowalny i łatwy w utrzymaniu, zrozumienie różnic między tymi typami zdarzeń to podstawa. Wybieraj mądrze!
Dodaj komentarz