Ono je eventsourcing a RPC nieco celkom ineho. RPC je imho "volanie vzdielenj procedury" a eventsourcing je spôsob spracovávania biznis požiadaviek. Eventsourcing môže byť imho implementovaný i cez rest, či rpc (aj keď rest - ako ho chápe väčšina ľudí, a REST podľa autora pôvodného výrazu sú dve značne odpišné veci).
Skúsim ale popísať eventsourcing z pohľadu ekosystému/aplikácií CQRS (Command Query Responsibility Segregation) a ES (event sourcing). Ak sa nemýlim, nemusia byť nevyhnutne spolu tieto spôsoby spracovania požiadaviek.
Užívateľ otvorí web. Nejaká mikroslužba, ktorá si číta ES log (databáza, alebo kafka napríklad), si vytvára z C (commands) aktuálny stav sveta (napríklad načíta commandy: VytvorUžívateľa(124, Fero, Mrkva, 14.3.1999); PripíšNaKonto(124, 13, CZK); VytvorObjednavku(66544, 124, .... ). Daná mikroslužba dostane request na stav konta usera 124. Šáhne do svojej privátnej databázy, kde si robí "cache" a odpovie aktuálnou hodnotou, 13 CZK.
Popri tom iní tím (v inom jazyku ideálne, nech je sranda) nakódi inú mikroslužbu a spustí ju. Mikroslužba si prebehne všetky commandy a vytvorí si svoju "cahce". Keď sa jej niekto spýta na stav konta užívateľa 124, odpovie "0.53€".
Výhoda, že kedykoľvek spravím novú verziu služby, tak po spustení mám vlastnú databázu (cache). Keď zmením logiku spracovania (aplikovania komandov na cache/view), môžem aplikáciu reštartnúť a spraovať celú históriu nanovo.
Obdobne je výhodou, že pri škálovaní postačuje štartnúť ďalšie inštancie aplikácie a tie si budú vytvárať svoje databázky. Je možné odboku vyvinúť službiu poskytujúcu dáta v inom formáte, alebo celkom iné dáta.
Nevýhoda je, že CQRS je asynchrónne. Teda web zavolá rest službu "nahraj mi kredit 10 CZK" a keď zavoláte hneď za tým rest pre získanie kreditu, môže (a bude zväčša) tam stará hodnota. Je to preto, že cqrS -> segregation. Pripísanie kreditu (rest volanie napríklad) blokuje a odpovedá až keď je command zapísaný do ES. To ale nič neznamená a rest volanie nedá odpoveď typu "outcome" z toho commandu. Odpoveďou je maximálne, že sa podarilo zapísať do ES. Po zapísaní komandu do es, sa niekde nejaký processor chytí a spracuje command a "vykoná ho". Teda do svojej súkromnej databázky si updatne riadok s aktuálnym balancom. Získanie stavu konta tak "vidí" túto novú hodnotu až po zapísaní zmeny do databázy (niektoré služby majú len in-memorry DB a pri reštarte si prebehnú "kompletný" ES). Táto vlastnosť sa označuje ako eventual consistency. Občas to kopne poriadne, keď sa človek nezamyslí dostatočne.
PS: ES má okrem samotného logu zvačša aj "snapshot" časť, kde sa "grupujú" samotné commandy. Teda napríklad pre stav konta sa komandy "+1";"+15";"-3" môžu grupnúť do "sum:13". Zrýchluje to štart a umožňuje zmenovanie es logu.
Viac ma narychlo nenapadá, bo som už 3 roky mimo tejto reality. Bola to ale zaujímavá skúsenosť.