Publikować event-y domenowe czy integracyjne?

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:

  1. Zachować spójność domeny i izolację logiki biznesowej.
  2. Modelować zdarzenia w sposób zgodny z językiem domenowym (Ubiquitous Language).
  3. 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:

  1. Musisz przesyłać dane do innych systemów (np. mikroserwisów).
  2. Zdarzenia wymagają wzbogacenia o szczegóły techniczne, np. adres wysyłki.
  3. Chcesz zapewnić asynchroniczną komunikację między różnymi modułami.

Kluczowe różnice

CechaDomain EventsIntegration Events
ZakresOgraniczony do logiki domenowejSzerszy, obejmujący integrację
OdbiorcyWewnętrzne komponenty systemuZewnętrzne systemy, bądź inne moduły systemu
ZawartośćMinimalna, domenowaSzczegółowa, techniczna
CelModelowanie domenyIntegracja

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:

  1. Model domenowy generuje OrderPlaced jako Domain Event.
  2. 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!

Autor wpisu

blog@orbisbit.com

Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Sprawdź również