Event Sourcing - diffovacie eventy

Event Sourcing - diffovacie eventy
« kdy: 05. 03. 2019, 12:22:32 »
Rastie mi kod pre jeden ES projekt a ES vzdy pridava velky "overhead". Ide o mikrosluzby takze pre kazdu treba riesit agregat(y), eventy, prikazy a td. Eventy maju schemu definovanu cez PB a kazdy event samozrejme musi mat "apply" handler.

S tym ako rastie codebase zacinam zvazovat prechod na unifikovany system. Co tym myslim je nasledovne:

Event sa vzdy vztahuje na nejaky "resource" alias agregat. Kazdy agregat je vo svojej podstate programova entita(nehovorim o ddd) co je vo svojej podstate dokument ktory mozno brat ako normalny json objekt.

Cela podstata eventu je zachytenie zmien ktore boli vykonane na specifickom agregate. Niekto moze debatovat o tom ze eventy nemusia byt vzdy spojene s agregatom(napriklad notifikacia o odoslani emailu) ale ja osobne to beriem tak ze event je VZDY napojeny na agregat, aj ked ten agregat moze reprezentovat len uplnu blbost ako je zaznam v logu, stale ide o zmenu stavu ktoru treba zachytit.

Vzhladom na hore uvedene zvazujem prerobit eventy na objekty, ktore ostanu tak ako su, avsak ich payload by nebol definovany schemou ale obsahoval by sadu zmien ktore boli na (json) dokumente vykonane formou k-v zoznamu kde kluc by bol cesta ku zmene(foo.bar.0.baz) a hodnota by bola hodnota priradena tejto ceste po aplikovani zmien(eventu). Null by znamenal zmazanie. Samozrejme by slo pouzit aj nejaky standard ako je napriklad rfc 6902 pre json patch.

Eventy by uz neniesil identitu(field_foo_changed, user_created, item_added_to_cart...) ale niesli by tagy oddelene ciarkou napriklad, ktore by niesli nazvy poli ktore boli zmenene. Cize kontext zmeny by zanikol.

Eventy stale budu podporovat verzovanie takze handler bude vediet po aplikovani eventu nacitat data z agregatu spravne. Replay eventov bude vzdy fungovat bez nutnosti riesit schemu nakolko ide o jendoduche "patchovanie" takze ku tomu netreba ziadnu specialnu logiku.

Listenery/projektory mozu stale pocuvat na eventy tak ako predtym, ale namiesto pocuvania na specificky event budud pocuvat na specificke zmeny - podla tagov, nie podla povodnych nazvov eventov zalozenych na kontexte.

Kvoli absencii schemy budu reaktory moct vytvorit aktualny stav agregatu bezs nutnosti poznat schemu. Pokial ide o nacitanie dat z agregatu, nic sa nemeni nakolko reaktory musi vzdy vediet aku formu dany agregat ma takze aj predtym musel reaktor rozumit datam ktore spracuva, cize nic sa nemeni, schema nie je nutna.

Takyto pristup ma dva nasledky - tym ze zanikne kontext eventov vzniknu eventy ktore mozu byt vecsie a obsahovat viacej udajov nez predtym, co zapricini vzysenie trafficu ale zaroven znizenie celkoveho poctu eventov.

Druhy nasledok je absencia kontextvych dat ktore neboli sucastou zmien ale boli uzitocne pre reaktory - napriklad aktualny menovy kurz. To sa vsak da vyriesit novym polom na objekte eventu specialne pre taketo data, takze prakticky sa nic nezmeni.

Co si o niecom takom myslite? Zatial som nedostal ziaden konstruktivny feedback, takze teoreticky nevidim nejake nevyhody takehoto systemu. Pozitiva o ktore mi ide su zrychlenie vyvoja a zjednodusenie logiky zakomponovania ES do biznis logiky.