Delta-streymið þitt sleppir seinkuðum commitum: byggðu áreiðanlegan bendil
Ein röð kom of seint því vatnsmerkið var ekki commit-mörk. Fylgdu biluninni og skilgreindu síðan þekju, mörk, varðveislutíma og örugga endurupptöku.
Hér er bilun sem ég hef séð gerast tvisvar, í tveimur mismunandi vélum. Útflutningur keyrir klukkan 10:00 og skráir hæsta tímaður síðustu breytingar sem hann sá. Ein færsla sem hófst klukkan 09:58 er enn opin, commit-ar klukkan 10:03 og ber tímaður frá því hún hófst. Næsti útflutningur biður aðeins um raðir nýrri en 10:00 og sér hana aldrei. Flutningsstærðin var frábær og gögnin röng.
Fylgdu útflutningnum sem týndi röð
Fylgdu röð atburða frekar en SQL. Forritið skrifar breytingartíma raðarinnar þegar færslan hefst, ekki þegar hún commit-ar. Útflytjandinn les vatnsmerki veggklukku meðan færslan er enn opin. Síðan commit-ar færslan með breytingartíma sem er eldri en geymda vatnsmerkið. Næsta lota neytandans hefst eftir vatnsmerkið, svo röðin verður eftir bendlinum og verður aldrei valin aftur.
Ekkert skráir villu, því ekkert mistókst. Það er það sem gerir þennan flokk galla dýran: delta-streymið er hratt, raðatölurnar virka sennilegar og týnda röðin kemur í ljós vikum síðar sem samræmingarmiði sem enginn getur endurgert.
Raðnúmer hafa sömu lögun galla af annarri ástæðu. Einfalt ID segir þér röðina sem gildum var úthlutað, ekki röðina sem færslur commit-uðu. Færsla sem tók lágt númer getur commit-að eftir einni sem tók hátt númer, svo bendill byggður á úthlutunarröð getur líka skilið eftir gat.
Fimm loforð sem streymið verður að standa við
Áður en þú velur flutning skaltu biðja upprunakerfið um samning með fimm skilmálum. Ef einhver skilmáli vantar hefurðu grunnreglu, ekki breytingastreymi.
- Þekja: innsetningar, uppfærslur og eyðingar, hver með stöðuga lyklinum sem þarf til að beita henni.
- Mörk: hvað bendilsgildi þýðir og hvað samkvæm lota inniheldur.
- Samkvæmni: hvernig skyldar töflur eru lesnar án að blanda saman ósamhæfum upprunastöðum.
- Varðveisla: hversu lengi aftengdur neytandi getur haldið áfram frá geymdri stöðu sinni.
- Endurstilling: studd heildarmynd þegar sú staða er ekki lengur gild.
Studd aðferð getur uppfyllt öll fimm. Skjöl SQL Server um breytingarakningu eru eitt áþreifanlegt birt dæmi: þau skilgreina lágmarksgilda útgáfu, skrá eyðingar jafnt sem breytingar og lýsa mynd-færslu sem spannar sannprófun, útgáfutöku og tengdar breytingafyrirspurnir. Það er dæmi um hvað eigi að krefjast af uppruna, ekki setningafræði sem þú getur límt í aðra vél.
Hannaðu eftirlitspunktinn sem hluta af flæðinu
Geymd staða neytandans er hin raunverulega stöðuvél, svo skrifaðu hana þannig. Bendillinn má aðeins færast áfram í gegnum verkflæðið sem hefur þegar beitt lotunni og commit-að markfærslunni.
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
Ef afhending mistekst hálfa leið skaltu samræma sömu lotu í stað þess að finna upp nýja upprunastöðu. Endurútdráttur með nýrri efri mörkum er leiðin sem hlutabeiting verður varanlegt gat. Speglunarreglan gildir líka hinum megin: idempotent beiting á markinu kemur í veg fyrir tvítekningar og gerir ekkert fyrir breytingu sem útdrátturinn sá aldrei.
Eyðingar þurfa skrár, ekki ályktanir
Að bera saman raðir sem enn eru til getur ekki sagt neytandanum hvaða lyklar hurfu. Uppruni sem skráir aldrei eyðingar skilur þig eftir með tvo ófullkomna valkosti: að halda lykilssögu nógu lengi til að diff-a eða keyra skýra heildarsamræmingu samkvæmt áætlun. Bæði eru hönnunarákvarðanir með kostnaði, og hvorugt er til nema einhver eigi það.
Varðveisla er sama tegund ákvörðunar. Hvert stutt breytingastreymi hefur glugga; tilgreindu hann í samningnum og varaðu við þegar eftirlitspunktur neytanda nálgast hann. Neytandi sem vaknar eftir tveggja vikna truflun ætti að lesa skýra villu "endurstilling nauðsynleg" í stað þess að fá hljóðlega hluta-lotu.
Mældu síðan hvort deltan var þess virði
Að falla aftur á að bera saman hvern lykil og hash er stundum rétt, og það er þess virði að vita hvað það kostar. Þú flytur enn upplýsingar um hverja röð, hash gefa þér ekki samkvæma heildarmynd milli taflna, og hash-skipulag kemur með sínar eigin spurningar um framsetningu og árekstra. Færri bæti með sannanlegum mörkum er markmiðið; færri bæti sem sleppa hljóðlega commit-aðri breytingu eru alls ekki delta.
Dálkur síðustu breytingar er vísbending. Bendill sem lifir af seinkað commit, eyðingu og langa truflun er samningur.