Il commento di Roberto al post che parla di `domain event` e di commistione degli stessi con il concetto di `event` in Pub/Sub mi porta a fare una considerazione:

image

Un sistema complesso porta con se delle complessità, direi che è quasi lapalissiano. Quello che vogliamo evitare come la peste è che le complessità si tramutino in complicazioni che hanno il solo effetto di ritorcersi contro il sistema stesso.

La complessità purtroppo difficilmente la possiamo evitare, probabilmente la possiamo arginare, ma la cosa importante è avere gli strumenti che ci permettano di capire quando il lavoro di arginamento che stiamo facendo ci stia portando dalla complessità verso la complicazione.

Il problema odierno, come evidenzia indirettamente Roberto, è che gli strumenti che abbiamo a disposizione danno pochissimo, se non zero, supporto quando ci troviamo di fronte alla costruzione di un sistema complesso, e magari anche distribuito, diventa quindi fondamentale comprendere tutte le insidie che si nascondono nella complessità ed è estremamente importante essere rigorosi e addirittura pignoli ad ogni piè sospinto.

Differenze

Un `domain event` è parte integrante, o fondante in alcuni casi, del dominio, vive in un `bounded context` e come ogni altre parte del dominio è incapsulata, e protetta, all’interno del BC di appartenenza. Un `domain event` nasce per soddisfare una necessità ben precisa: event sourcing, tale necessità determina che l’evento deve per forza di cose contenere tutte informazioni necessarie a ricostruire lo stato nel BC dove l’evento si è verificato.
Incapsulare un `domain event` è fondamentale per proteggere gli altri, quelli che stanno fuori, al fine di evitare che possano avere dipendenze da informazioni che non gli appartengono.

Dall’altra parte un evento, in un modello basato su `pub/sub`, ha uno scopo diametralmente opposto, quello di superare i confini del BC è destinato per il grande pubblico, grande pubblico che tipicamente non è noto a chi pubblica l’evento. In questo scenario le informazioni che l’evento porta con se sono il minimo indispensabile, sono ridotte all’osso con lo scopo di proteggere se stessi e il grande pubblico.

Una metafora:

Pensate di correre con qualcuno, avete due scelte:

  1. correre abbracciati;
  2. correre tenendovi per mano;

Il primo caso richiede un enorme affiatamento e il cambio di comportamento di uno dei corridori influenza moltissimo l’altro, facendogli correre anche dei rischi; la seconda modalità concede molta più libertà ai corridori facendo si che anche due perfetti sconosciuti siano in grado di correre insieme con facilità.

  • correre abbracciati => domain event;
  • correre tenendovi per mano => event;

Di riffa o di raffa…da qui non si scappa ;-)