Váš delta feed stráca neskoré commity: postavte spoľahlivý kurzor
Jeden riadok dorazil neskoro, pretože watermark nebol hranicou commitu. Prejdite zlyhanie a potom definujte pokrytie, hranicu, retenciu a bezpečné obnovenie.
Tu je zlyhanie, ktoré som videl dvakrát, v dvoch rôznych engineoch. Export beží o 10:00 a zaznamená najvyššiu časovú pečiatku poslednej zmeny, ktorú videl. Jedna transakcia, ktorá začala o 09:58, je stále otvorená, commitne o 10:03 a nesie časovú pečiatku z času svojho začiatku. Ďalší export žiada len riadky novšie ako 10:00 a nikdy ju neuvidí. Veľkosť prenosu bola vynikajúca a dáta boli nesprávne.
Prejdite export, ktorý stratil riadok
Sledujte poradie udalostí, nie SQL. Aplikácia zapisuje čas zmeny riadka pri začiatku transakcie, nie pri commite. Exportér číta watermark podľa nástenných hodín, kým je transakcia stále otvorená. Potom transakcia commitne s časom zmeny starším než uložený watermark. Ďalšia dávka konzumenta začína za watermarkom, takže riadok zostáva za kurzorom a už nikdy nebude vybraný.
Nič nezaznamená chybu, pretože nič nezlyhalo. To robí túto triedu chýb drahou: delta feed je rýchly, počty riadkov vyzerajú vierohodne a chýbajúci riadok sa objaví o týždne neskôr ako tiket na rekonciliáciu, ktorý nikto nedokáže reprodukovať.
Sekvenčné čísla majú rovnaký tvar vady z iného dôvodu. Monotónny ID vám hovorí poradie prideľovania hodnôt, nie poradie commitov transakcií. Transakcia, ktorá si vzala nízke číslo, môže commitnúť po tej, ktorá si vzala vysoké, takže kurzor založený na poradí prideľovania môže tiež nechať dieru.
Päť sľubov, ktoré musí feed splniť
Skôr než zvolíte transport, požiadajte zdrojový systém o kontrakt s piatimi klauzulami. Ak niektorá chýba, máte heuristiku, nie feed zmien.
- Pokrytie: vloženia, aktualizácie a mazania, každé so stabilným kľúčom potrebným na použitie.
- Hranica: čo znamená hodnota kurzora a čo obsahuje konzistentná dávka.
- Konzistencia: ako sa čítajú súvisiace tabuľky bez miešania nekompatibilných stavov zdroja.
- Retencia: ako dlho môže odpojený konzument pokračovať zo svojej uloženej pozície.
- Reinicializácia: podporovaný úplný snapshot pre prípad, keď tá pozícia už nie je platná.
Podporovaný mechanizmus dokáže splniť všetkých päť. Dokumentácia SQL Servera o sledovaní zmien je jeden konkrétny publikovaný príklad: definuje minimálnu platnú verziu, zaznamenáva mazania aj zmeny a opisuje snapshot transakciu, ktorá zahŕňa validáciu, zachytenie verzie a súvisiace dopyty na zmeny. Je to príklad, čo od zdroja vyžadovať, nie syntax, ktorú vložíte do iného enginu.
Navrhnite kontrolný bod ako súčasť pipeline
Uložená pozícia konzumenta je skutočný stavový stroj, tak ho tak aj zapíšte. Kurzor smie postúpiť len cez workflow, ktorý už dávku použil a commitol cieľovú transakciu.
cursor = durable_checkpoint() # last fully applied position
batch = extract(cursor, upper_bound) # one consistent batch
apply(batch) # idempotent at the target
commit()
checkpoint(batch.upper_bound) # only now
Ak doručenie zlyhá v polovici, rekoncilujte rovnakú dávku namiesto vymýšľania novej pozície zdroja. Opätovné vytiahnutie s čerstvejšou hornou hranicou je spôsob, akým sa čiastočné použitie stane trvalou medzerou. Zrkadlové pravidlo platí aj na druhej strane: idempotentné použitie v cieli bráni duplikátom a nerobí nič pre zmenu, ktorú vytiahnutie nikdy nevidelo.
Mazania potrebujú záznamy, nie závery
Porovnávanie riadkov, ktoré ešte existujú, nemôže konzumentovi povedať, ktoré kľúče zmizli. Zdroj, ktorý nikdy nezaznamenáva mazania, vám necháva dve nedokonalé možnosti: držať históriu kľúčov dosť dlho na diff, alebo spúšťať výslovnú úplnú rekonciliáciu podľa plánu. Obe sú dizajnové rozhodnutia s cenou a žiadne neexistuje, ak ho niekto nevlastní.
Retencia je rovnaký typ rozhodnutia. Každý podporovaný feed zmien má okno; uveďte ho v kontrakte a varujte, keď sa kontrolný bod konzumenta priblíži. Konzument, ktorý sa zobudí po dvojtýždňovom výpadku, by mal čítať jasnú chybu „nevyhnutná reinicializácia“, nie ticho dostať čiastočnú dávku.
Potom zmerajte, či sa delta vyplatila
Vrátiť sa k porovnávaniu každého kľúča a hashu je niekedy správne a stojí za to vedieť, koľko to stojí. Stále prenášate informácie o každom riadku, hashe vám nedajú konzistentný snapshot naprieč tabuľkami a hash schéma prináša vlastné otázky o reprezentácii a kolíziách. Menej bajtov s overiteľnou hranicou je cieľ; menej bajtov, ktoré ticho zahodia commitnutú zmenu, nie je žiadna delta.
Stĺpec poslednej zmeny je nápoveda. Kurzor, ktorý prežije neskorý commit, mazanie a dlhý výpadok, je kontrakt.