Dostupné
Replika a checkpoint
Replika je jediná věc v systému, která se nedá znovu postavit z ničeho jiného. Všechno ostatní je odvozené. Proto se o její konzistenci rozhoduje na úrovni transakce, ne na úrovni dobré vůle.
- Položky fáze
- 1.3 replika a checkpoint, 1.4 poller s výhradním leasem
- Závisí na
- 1.1 — typovaně naparsované akce
- Vstup už existuje
- archiv surového feedu 1. 7.–9. 9. 2026, 849 935 událostí, jen lokálně
- Invarianty
- ING-1 až ING-7 v docs/INGESTION.md
- Stav
- 1.3 a 1.4 hotovo 30. 9. 2026 — ingest/replica.py, ingest/poller.py, worker just worker; backfill pod počátkem repliky po souvislých blocích hotový 1. 10. 2026 — ingest/backfill.py, ADR 0011
Zápis a checkpoint v jedné transakci
Checkpoint je jediné číslo: poslední trvale zpracovaná akce. Posouvá se ve stejné transakci, ve které se zapisují akce — jinak existuje okno, ve kterém pád znamená přeskočenou dávku.
Ze dvou možných chyb je zvolená ta neškodná. Pád před commitem vede k opětovnému načtení téže dávky, a protože je zápis idempotentní podle ID akce, druhý průchod nic nezmění. Pád po posunu checkpointu bez zápisu by naopak vedl k díře, kterou nikdo nikdy nenajde.
%% title: Smyčka příjmu
%% caption: Feed vlastní právě jeden poller. Zápis akcí a posun checkpointu proběhnou v jedné transakci; chyba parsování checkpoint nikdy neposune.
flowchart TD
L{"Získat lease<br/>v Redisu, TTL"} -- "drží jiný" --> X(["Konec tiku"])
L -- "získán" --> C["Přečíst checkpoint<br/>id poslední zpracované akce"]
C --> B{"Rozpočet požadavků<br/>50/min, 3000/den"}
B -- "vyčerpán" --> Z(["Spát, neposílat"])
B -- "zbývá" --> F["Stáhnout dávku<br/>za checkpointem"]
F --> P{"Parsování<br/>do typovaných akcí"}
P -- "chybný tvar" --> FC(["Fail closed<br/>checkpoint stojí"])
P -- "v pořádku" --> TX[("Jedna transakce:<br/>zápis akcí idempotentně<br/>+ posun checkpointu")]
TX --> D["Zařadit dokumentové úlohy"]
D --> M{"Další dávka<br/>v limitu tiku?"}
M -- "ano" --> B
M -- "ne" --> X
click L href "/architecture/jeden-zapisovatel-mnoho-ctenaru" "Jeden zapisovatel, mnoho čtenářů"
click B href "/roadmap/klient-ws-isir-a-limity" "Klient WS ISIR a limity"
click C href "/roadmap/replika-a-checkpoint" "Replika a checkpoint"
click F href "/roadmap/klient-ws-isir-a-limity" "Klient WS ISIR a limity"
click P href "/roadmap/klient-ws-isir-a-limity" "Klient WS ISIR a limity"
click TX href "/roadmap/replika-a-checkpoint" "Replika a checkpoint"
click D href "/architecture/oddelena-dokumentova-pipeline" "Oddělená dokumentová pipeline"
click FC href "/architecture/chovani-pri-selhani" "Chování při selhání"
class B st-available
class C st-available
class F st-available
class P st-available
class TX st-available
Barva uzlu je stav položky na roadmapě: Dostupné
Jeden vlastník feedu
Feed čte právě jeden poller, držící lease s omezenou platností. Dva souběžní polleři si duplikují práci a závodí o checkpoint; obojí je horší než pomalejší běh.
Chyba parsování ani chybový stav zdroje checkpointem nikdy nepohnou. Zpět se checkpoint posune jen výslovným zásahem operátora podle runbooku.
Co replika není
Není to aktuální stav a není to místo, kde se opravují chyby v interpretaci. Akce se nemění a nemažou; oprava je vždy na straně projektoru. Tím se z opravy stává rutina, která nesahá na zdroj dat.
Repliku jde naplnit i z lokálního archivu feedu bez jediného dotazu na rejstřík: každá dávka se před načtením ověří hashem a replika si zapíše, odkud je úplná (ingest/archive.py). Historii pod tím doplňuje backfill po souvislých blocích (ingest/backfill.py, ADR 0011).
Kde to v repozitáři žije
src/progresus_isir/ingest/replica.py— zápis dávky a posun checkpointu v jedné transakcisrc/progresus_isir/ingest/poller.py— jeden ohraničený tick pod leasemdocs/INGESTION.md— poll smyčka, invarianty a vztah backfillu k živému provozudocs/ARCHITECTURE.md— co je nedotknutelné a co odvozenédocs/runbooks/replay.md— operátorský postup přehrání, včetně posunu checkpointu
Souvisí
Klient WS ISIR a limity
DostupnéKlient k IsirWsPublicService, typované parsování akcí a fail-closed mapování chybových stavů. Rozpočet 50/min a 3000/den je sdílený všemi procesy přes Redis a kontroluje se před každým pokusem; jistič je sdílený a po prodlevě pustí jediný zkušební požadavek. Když Redis neodpovídá, požadavek se neodešle.
Detail
Projekce
RozpracovánoŘízení, přihlášky a věřitelé z feedu, přehrávané z logu; ověřené dílčí pohledávky z vytěžených přihlášek se zapisují s proveniencí, odvození stavu pohledávky za přihlášením zatím chybí. Oprava projektoru je rutina: zvýšit verzi a přehrát, bez jediného dotazu na rejstřík.
Detail
Log je pravda, projekce je odvozená
Stav se rekonstruuje přehráním neměnného proudu událostí. Oprava chyby v interpretaci je rutina, ne krize — a nevyžaduje znovu zatěžovat veřejný rejstřík.
Detail