Il-feed delta tiegħek jitlef commits tardivi: ibni cursor affidabbli
Ringiela waslet tard għax il-watermark ma kienx konfini ta' commit. Segwi l-falliment, imbagħad iddefinixxi kopertura, konfini, żamma u tkomplija sigura.
Hawn falliment li rajt iseħħ darbtejn, f'żewġ magni differenti. Esportazzjoni taħdem fl-10:00 u tirrekordja l-ogħla timbru tal-ħin tal-aħħar modifika li rat. Tranżazzjoni li bdiet fid-09:58 għadha miftuħa, tagħmel commit fl-10:03 u ġġorr timbru tal-ħin minn meta bdiet. L-esportazzjoni li jmiss titlob biss ringieli aktar ġodda mill-10:00 u qatt ma taraha. Id-daqs tat-trasferiment kien eċċellenti u d-dejta kienet ħażina.
Segwi l-esportazzjoni li tilfet ringiela
Segwi l-ordni tal-avvenimenti, mhux is-SQL. L-applikazzjoni tikteb il-ħin tal-modifika tar-ringiela meta tibda t-tranżazzjoni, mhux meta tagħmel commit. L-esportatur jaqra watermark tal-arloġġ tal-ħajt waqt li dik it-tranżazzjoni għadha miftuħa. Imbagħad it-tranżazzjoni tagħmel commit b'ħin tal-modifika eqdem mill-watermark maħżun. Il-lott li jmiss tal-konsumatur jibda wara l-watermark, għalhekk ir-ringiela tibqa' wara l-cursor u qatt mhi se tintgħażel mill-ġdid.
Xejn ma jirrekordja żball, għax xejn ma falla. Dan huwa dak li jagħmel din il-klassi ta' bug għalja: il-feed delta huwa mgħaġġel, l-għadd tar-ringieli jidher plawżibbli, u r-ringiela nieqsa tfeġġ ġimgħat wara bħala biljett ta' rikonċiljazzjoni li ħadd ma jista' jirriproduċi.
In-numri tas-sekwenza għandhom l-istess forma ta' difett għal raġuni oħra. ID monotoniku jgħidlek l-ordni li fiha ġew allokati l-valuri, mhux l-ordni li fiha saru commit it-tranżazzjonijiet. Tranżazzjoni li ħadet numru baxx tista' tagħmel commit wara waħda li ħadet numru għoli, għalhekk cursor ibbażat fuq l-ordni tal-allokazzjoni jista' wkoll iħalli toqba.
Ħames wegħdiet li l-feed irid iżomm
Qabel tagħżel trasport, itlob mis-sistema sors kuntratt b'ħames klawsoli. Jekk tinkiser xi klawsola, għandek euristika u mhux feed ta' bidliet.
- Kopertura: inserzjonijiet, aġġornamenti u tħassir, kull wieħed maċ-ċavetta stabbli meħtieġa biex jiġi applikat.
- Konfini: xi jfisser valur tal-cursor u x'inih fih lott konsistenti.
- Konsistenza: kif jinqraw tabelli relatati mingħajr ma jitħalltu stati sors inkumpatibbli.
- Żamma: kemm jista' jkompli konsumatur skonnettjat mill-pożizzjoni maħżuna tiegħu.
- Rinizjalizzazzjoni: snapshot sħiħ appoġġjat għal meta dik il-pożizzjoni m'għadhiex valida.
Mekkaniżmu appoġġjat jista' jissodisfa l-ħamsa. Id-dokumentazzjoni ta' SQL Server dwar it-traċċar tal-bidliet hija eżempju ppubblikat konkret: tiddefinixxi verżjoni minima valida, tirrekordja t-tħassir kif ukoll il-bidliet, u tiddeskrivi transazzjoni snapshot li tkopri validazzjoni, qbid tal-verżjoni u l-mistoqsijiet tal-bidliet relatati. Huwa eżempju ta' x'għandek titlob minn sors, mhux sintassi li tista' timporta f'magna oħra.
Iddisinja l-punt ta' kontroll bħala parti mill-pipeline
Il-pożizzjoni maħżuna tal-konsumatur hija l-magna tal-istat vera, għalhekk iktibha hekk. Il-cursor jista' javvanza biss permezz tal-fluss tax-xogħol li diġà applika l-lott u għamel commit tat-transazzjoni fil-mira.
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
Jekk il-kunsinna tfalli f'nofs triq, irrikonċilja dak l-istess lott minflok tinventa pożizzjoni sors ġdida. L-estrazzjoni mill-ġdid b'konfini ta' fuq aktar frisk hija t-triq li biha applikazzjoni parzjali ssir vojt permanenti. Ir-regola tal-mera tgħodd ukoll fuq in-naħa l-oħra: applikazzjoni idempotenti fil-mira tipprevjeni duplikati u ma tagħmel xejn għal bidla li l-estrazzjoni qatt ma rat.
It-tħassir jeħtieġ rekords, mhux konklużjonijiet
Li tqabbel ringieli li għadhom jeżistu ma tistax tgħid lill-konsumatur liema ċwievet spiċċaw. Sors li qatt ma jirrekordja tħassir iħallik b'żewġ għażliet imperfetti: iżżomm storja taċ-ċwievet twila biżżejjed għal diff, jew tmexxi rikonċiljazzjoni sħiħa espliċita skont skeda. It-tnejn huma deċiżjonijiet tad-disinn b'kost, u l-ebda ma teżisti sakemm xi ħadd ma jkun jippossjediha.
Iż-żamma hija l-istess tip ta' deċiżjoni. Kull feed tal-bidliet appoġġjat għandu tieqa; iddikjaraha fil-kuntratt u widdeb meta l-punt ta' kontroll tal-konsumatur joqrob lejha. Konsumatur li jqum wara waqfa ta' ġimagħtejn għandu jaqra żball ċar "rinizjalizzazzjoni meħtieġa" minflok ma jirċievi lott parzjali bil-kwiet.
Imbagħad kejjel jekk id-delta kienx jistħoqqlha
Li terġa' lura għat-tqabbil ta' kull ċavetta u hash kultant huwa tajjeb, u jiswa li tkun taf x'jiswa. Għadek qed tittrasferixxi informazzjoni dwar kull ringiela, il-hashes ma jagħtukx snapshot konsistenti bejn it-tabelli, u skema tal-hash ġġib il-mistoqsijiet tagħha dwar rappreżentazzjoni u kolliżjonijiet. Inqas bytes b'konfini verifikabbli huwa l-għan; inqas bytes li bil-kwiet iwarrbu bidla kommessa mhuwa xejn delta.
Kolonna tal-aħħar modifika hija ħjiel. Cursor li jissopravivi commit tardiv, tħassir u waqfa twila huwa kuntratt.