Mae eich ffrwd delta yn colli commits hwyr: adeiladwch gwrser dibynadwy
Daeth rhes yn hwyr oherwydd nad oedd y marc dŵr yn ffin commit. Dilynwch y methiant, yna diffiniwch gwmpas, ffin, cadwraeth ac ailddechrau diogel.
Dyma fethiant rydw i wedi'i weld yn digwydd ddwywaith, mewn dau injan wahanol. Mae allgludiad yn rhedeg am 10:00 ac yn cofnodi'r stamp amser addasiad diwethaf uchaf a welodd. Mae un trafodiad a ddechreuodd am 09:58 yn dal ar agor, yn commitio am 10:03, ac yn cario stamp amser o'r adeg y dechreuodd. Mae'r allgludiad nesaf yn gofyn yn unig am resi sy'n newyddach na 10:00 ac yn byth yn ei gweld. Roedd maint y trosglwyddiad yn ardderchog a'r data yn anghywir.
Dilynwch yr allgludiad a gollodd res
Olrheiniwch drefn y digwyddiadau yn hytrach na'r SQL. Mae'r rhaglen yn ysgrifennu amser addasu'r rhes pan fydd y trafodiad yn dechrau, nid pan fydd yn commitio. Mae'r allgludydd yn darllen marc dŵr cloc wal tra bod y trafodiad hwnnw'n dal ar agor. Yna mae'r trafodiad yn commitio ag amser addasu sy'n hŷn na'r marc dŵr a gadwyd. Mae swp nesaf y defnyddiwr yn dechrau ar ôl y marc dŵr, felly mae'r rhes y tu ôl i'r cwrser ac ni fydd byth yn cael ei dewis eto.
Nid oes unrhyw beth yn cofnodi gwall, oherwydd ni methodd unrhyw beth. Dyna sy'n gwneud y dosbarth hwn o fyg yn gostus: mae'r ffrwd delta yn gyflym, mae'r cyfrifon rhes yn edrych yn gredadwy, ac mae'r rhes goll yn dod i'r amlwg wythnosau'n ddiweddarach fel tocyn cysoni na all neb ei ailgynhyrchu.
Mae gan rifau dilyniannol yr un siâp diffyg am reswm gwahanol. Mae ID monotonig yn dweud wrthych y drefn y dyrennir gwerthoedd, nid y drefn y commitiodd trafodiadau. Gall trafodiad a gymerodd rif isel commitio ar ôl un a gymerodd rif uchel, felly gall cwrser sy'n seiliedig ar drefn dyraniad adael twll hefyd.
Pum addewid y mae'n rhaid i'r ffrwd eu cyflawni
Cyn dewis cludiant, gofynnwch i'r system ffynhonnell am gontract â phum cymal. Os oes unrhyw gymal ar goll, heuristig sydd gennych, nid ffrwd newidiadau.
- Gwmpas: mewnosodiadau, diweddariadau a dileadau, pob un â'r allwedd sefydlog sydd ei hangen i'w chymhwyso.
- Ffin: beth mae gwerth cwrser yn ei olygu a beth sydd mewn swp cyson.
- Cysondeb: sut mae tablau cysylltiedig yn cael eu darllen heb gymysgu cyflyrau ffynhonnell anghydnaws.
- Cadwraeth: pa mor hir y gall defnyddiwr sydd wedi'i ddatgysylltu ailddechrau o'i safle a gadwyd.
- Ailgychwyn: snapshot llawn â chymorth ar gyfer pan nad yw'r safle hwnnw'n ddilys mwyach.
Gall mecanwaith â chymorth fodloni'r pum un. Dogfennaeth SQL Server ar olrhain newidiadau yw un enghraifft gyhoeddedig concrit: mae'n diffinio fersiwn ddilys lleiaf, yn cofnodi dileadau yn ogystal â newidiadau, ac yn disgrifio trafodiad snapshot sy'n cwmpasu dilysu, cipio fersiwn a'r ymholiadau newid cysylltiedig. Enghraifft yw o'r hyn y dylech ei fynnu oddi wrth ffynhonnell, nid cystrawen y gallwch ei gludo i injan arall.
Dyluniwch y pwynt gwirio fel rhan o'r piblinell
Safle a gadwyd y defnyddiwr yw'r peiriant cyflwr go iawn, felly ysgrifennwch ef felly. Ni chaiff y cwrser symud ymlaen ond trwy'r llif gwaith sydd eisoes wedi cymhwyso'r swp ac wedi commitio'r trafodiad targed.
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
Os bydd cyflenwi'n methu hanner ffordd, cysoniwch yr un swp yn hytrach na dyfeisio safle ffynhonnell newydd. Ailechdynnu â ffin uchaf fwy newydd yw'r ffordd y mae cymhwysiad rhannol yn dod yn fwlch parhaol. Mae'r rheol drych yn dal i fod ar yr ochr arall hefyd: mae cymhwysiad idempotent yn y targed yn atal dyblygiadau ac yn gwneud dim i newid na welodd yr echdyniad byth.
Mae dileadau angen cofnodion, nid casgliadau
Ni all cymharu resi sy'n dal i fodoli ddweud wrth ddefnyddiwr pa allweddi a ddiflannodd. Mae ffynhonnell sy'n byth yn cofnodi dileadau yn gadael dau opsiwn amherffaith: cadw hanes allweddi'n ddigon hir i'w gymharu, neu gynnal cysoni llawn penodol ar amserlen. Mae'r ddau yn benderfyniadau dylunio â chost, ac nid oes yr un yn bodoli oni bai bod rhywun yn berchen arno.
Mae cadwraeth yr un math o benderfyniad. Mae gan bob ffrwd newidiadau â chymorth ffenestr; datganwch hi yn y contract a rhybuddiwch pan fydd pwynt gwirio defnyddiwr yn agosáu ati. Dylai defnyddiwr sy'n deffro ar ôl ymyriad pythefnos ddarllen gwall clir "mae angen ailgychwyn" yn hytrach na derbyn swp rhannol yn ddistaw.
Yna mesurwch a oedd y delta'n werth chweil
Mae dychwelyd at gymharu pob allwedd a hash weithiau'n iawn, ac mae'n werth gwybod beth mae'n ei gostio. Rydych chi'n dal i drosglwyddo gwybodaeth am bob rhes, nid yw hashes yn rhoi snapshot cyson ar draws tablau i chi, ac mae cynllun hash yn dod â'i gwestiynau ei hun am gynrychiolaeth a gwrthdrawiadau. Llai o bytes â ffin y gellir ei dilysu yw'r nod; nid delta o gwbl yw llai o bytes sy'n gollwng newid a commitiwyd yn ddistaw.
Mae colofn addasiad diwethaf yn awgrym. Mae cwrser sy'n goroesi commit hwyr, dilead ac ymyriad hir yn gontract.