Log je pravda, projekce je odvozená
Rejstřík publikuje neměnný, číselně uspořádaný proud akcí. Systém, který si z něj udělá jen aktuální tabulku, zahodí jedinou vlastnost, kterou zdroj dává zadarmo — možnost vrátit se k tomu, co bylo řečeno, a přečíst to znovu jinak.
- Replika
- append-only log akcí, idempotentní podle ID akce
- Projekce
- odvozená, kdykoli znovu postavitelná, nikdy ručně nepatchovaná
- Oprava
- oprav projektor, zvyš jeho verzi, přehraj z logu
- Stav
- archiv feedu existuje; replika a projektor v databázi jsou plánované (fáze 1)
Co je nedotknutelné
Replika a úložiště dokumentů. Všechno ostatní je odvozené a znovu postavitelné, a zálohovací politika neplyne z ničeho jiného než z téhle věty.
%% title: Oprava je přehrání, ne ruční UPDATE
%% caption: Replika se nikdy needituje. Chyba v interpretaci se opraví v projektoru, zvýší se jeho verze a projekce se přehraje z logu; extrakce se nevolá znovu, protože je v cache.
flowchart LR
LOG[("Replika<br/>neměnné akce")] --> P1["Projektor vN"] --> V1[("Projekce vN")]
V1 -. "chyba v interpretaci" .-> FIX["Oprava projektoru<br/>verze vN+1"]
LOG --> P2["Projektor vN+1"]
FIX --> P2
CACHE[("Cache extrakcí")] --> P2
P2 --> V2[("Projekce vN+1")]
BAD["Ruční UPDATE"] -. "zakázáno" .-x V1
click LOG href "/architecture/event-sourcing-protoze-zdroj-je-event-stream" "Event sourcing"
click CACHE href "/architecture/vysledky-extrakce-jsou-cachovane" "Výsledky extrakce jsou cachované"
click V1 href "/roadmap/projekce" "Projekce"
click V2 href "/roadmap/projekce" "Projekce"
click BAD href "/about/log-je-pravda-projekce-je-odvozena" "Log je pravda, projekce je odvozená"
class V1 st-in_progress
class V2 st-in_progress
Barva uzlu je stav položky na roadmapě: Rozpracováno
Proč to není jen otázka elegance
Interpretace zdroje se bude měnit — u dokumentů, které jsou převážně skeny, se mění pokaždé, když se najde nový tvar formuláře. Kdyby oprava interpretace znamenala znovu stáhnout rejstřík, narazila by na strop 3000 požadavků denně a tým by ji odložil.
Odložená oprava je ve skutečnosti neprovedená oprava. Přehrání logu z toho dělá rutinní operaci, která nikoho nic nestojí a nikoho o nic neprosí.
Co se tím nezískává
Event sourcing neřeší, jestli je interpretace správná. Řeší jen to, že se dá opravit. Kvalita dat pořád stojí na extrakci, prahu spolehlivosti a lidské kontrole.
Kde to v repozitáři žije
docs/ARCHITECTURE.md— pět definujících rozhodnutí a chování při selhánídocs/INGESTION.md— poll smyčka, checkpoint, backfill versus živý provoz, přehrávánídocs/runbooks/replay.md— runbook přehrání projekce
Souvisí
Event sourcing, protože zdroj je event stream
Systém je konzumentem oficiálního proudu událostí. Z něj staví lokální append-only repliku a z ní přehrává projekci aktuálního stavu. Oprava chyby v interpretaci znamená přehrát log, ne znovu stahovat rejstřík.
Detail
Výsledky extrakce jsou content-addressed a cachované
Dokument je identifikovaný SHA-256 svých bajtů a výsledek extrakce je uložený proti tomuto hashi. Přehrání projekce znovu použije cache a nespustí OCR ani LLM. Bez toho by každá oprava projektoru stála celý backfill znovu.
Detail