Sinu delta-voog jätab hiliseid commite vahele: ehita usaldusväärne kursor
Üks rida saabus hilja, sest vesimärk ei olnud commiti piir. Jälgi riket ning määratle seejärel katvus, piir, säilitamine ja ohutu jätkamine.
Siin on rike, mida olen näinud kaks korda, kahes erinevas mootoris. Eksport töötab kell 10:00 ja salvestab kõrgeima nähtud viimase muutmise ajatempli. Üks tehing, mis algas kell 09:58, on endiselt avatud, commitib kell 10:03 ja kannab ajatemplit oma alguse hetkest. Järgmine eksport küsib ainult ridu, mis on uuemad kui 10:00, ega näe seda kunagi. Ülekande suurus oli suurepärane ja andmed olid valed.
Jälgi eksporti, mis kaotas rea
Jälgi sündmuste järjekorda, mitte SQL-i. Rakendus kirjutab rea muutmise aja tehingu alguses, mitte commitimisel. Eksportija loeb seinakella vesimärki, kui see tehing on veel avatud. Seejärel commitib tehing muutmise ajaga, mis on salvestatud vesimärgist vanem. Tarbija järgmine pakett algab pärast vesimärki, seega jääb rida kursorist tahapoole ega valita kunagi uuesti.
Miski ei logi viga, sest miski ei ebaõnnestunud. Just see teeb selle veaklassi kalliks: delta-voog on kiire, ridade arvud tunduvad usutavad ja puuduv rida ilmub nädalaid hiljem vastavustikettina, mida keegi ei suuda korrata.
Järjekorranumbritel on sama kujuga viga teisel põhjusel. Monotoonne ID ütleb sulle väärtuste eraldamise järjekorra, mitte tehingute commitimise järjekorra. Madala numbri võtnud tehing võib commitida pärast kõrge numbri võtnut, seega eraldusjärjekorral põhinev kursor võib samuti augu jätta.
Viis lubadust, mille voog peab andma
Enne transpordi valimist küsi allikasüsteemilt viie klausliga lepingut. Kui mõni klausel puudub, on sul heuristika, mitte muudatuste voog.
- Katvus: lisamised, uuendused ja kustutamised, igaüks rakendamiseks vajaliku püsiva võtmega.
- Piir: mida kursori väärtus tähendab ja mida sisaldab järjepidev pakett.
- Järjepidevus: kuidas seotud tabeleid loetakse ühildumatuid allikaolekuid segamata.
- Säilitamine: kui kaua saab katkenud tarbija oma salvestatud positsioonilt jätkata.
- Reinitsialiseerimine: toetatud täielik hetktõmmis, kui see positsioon enam ei kehti.
Toetatud mehhanism suudab täita kõik viis. SQL Serveri muudatuste jälgimise dokumentatsioon on üks konkreetne avaldatud näide: see määratleb minimaalse kehtiva versiooni, registreerib kustutamised ja muudatused ning kirjeldab hetktõmmise tehingut, mis hõlmab valideerimist, versiooni jäädvustamist ja seotud muudatuspäringuid. See on näide sellest, mida allikalt nõuda, mitte süntaks, mille saab teise mootorisse kleepida.
Kujunda kontrollpunkti torujuhtme osana
Tarbija salvestatud positsioon on tegelik olekumasin, seega kirjuta see nii. Kursor tohib edasi liikuda ainult selle töövoo kaudu, mis on paketi juba rakendanud ja sihtehingu commitinud.
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
Kui tarne ebaõnnestub poolel teel, lepita seesama pakett, mitte leiuta uut allikapositsiooni. Värskema ülemise piiriga uuesti ekstraktimine on viis, kuidas osaline rakendamine muutub püsivaks lüngaks. Peeglireegel kehtib ka teisel pool: idempotentne rakendamine sihtkohas hoiab ära duplikaadid ega tee midagi muudatuse jaoks, mida ekstraktimine kunagi ei näinud.
Kustutamised vajavad kirjeid, mitte järeldusi
Endiselt olemasolevate ridade võrdlemine ei saa tarbijale öelda, millised võtmed kadusid. Allikas, mis ei registreeri kunagi kustutamisi, jätab sulle kaks puudulikku valikut: hoida võtmeajalugu diffimiseks piisavalt kaua või käivitada plaanipäraselt selgesõnaline täielik lepitus. Mõlemad on kuluga disainiotsused ja kumbki ei eksisteeri, kui keegi seda ei oma.
Säilitamine on sama liiki otsus. Igal toetatud muudatuste vool on aken; deklareeri see lepingus ja hoiata, kui tarbija kontrollpunkt sellele läheneb. Tarbija, kes ärkab pärast kahenädalast katkestust, peaks lugema selget viga "vajalik on reinitsialiseerimine", mitte vaikselt saama osalise paketi.
Seejärel mõõda, kas delta oli seda väärt
Iga võtme ja räsi võrdlemise juurde tagasi minemine on mõnikord õige ja tasub teada, mida see maksab. Sa edastad ikka infot iga rea kohta, räsid ei anna sulle tabeliteülest järjepidevat hetktõmmist ja räsiskeeem toob kaasa oma küsimused esituse ja kokkupõrgete kohta. Vähem baite kontrollitava piiriga on eesmärk; vähem baite, mis vaikselt kaotavad commititud muudatuse, ei ole üldse delta.
Viimase muutmise veerg on vihje. Kursor, mis elab üle hilise commiti, kustutamise ja pika katkestuse, on leping.