Ահա մի խափանում, որը տեսել եմ երկու անգամ՝ երկու տարբեր շարժիչներում։ Արտահանումն աշխատում է 10:00-ին և գրանցում է տեսած ամենաբարձր վերջին փոփոխության ժամանիշը։ Մի գործարք, որը սկսվել է 09:58-ին, դեռ բաց է, commit է լինում 10:03-ին և կրում է իր սկզբի պահի ժամանիշը։ Հաջորդ արտահանումը խնդրում է միայն 10:00-ից նոր տողեր և երբեք չի տեսնում այն։ Փոխանցման ծավալը հիանալի էր, իսկ տվյալները՝ սխալ։

Հետևեք այն արտահանմանը, որը կորցրեց տողը

Հետևեք իրադարձությունների հերթականությանը, ոչ թե SQL-ին։ Հավելվածը գրում է տողի փոփոխության ժամը գործարքի սկզբում, ոչ commit-ի պահին։ Արտահանիչը կարդում է պատի ժամացույցի ջրային նշանը, մինչ գործարքը դեռ բաց է։ Այնուհետև գործարքը commit է լինում պահված ջրային նշանից ավելի հին փոփոխության ժամով։ Սպառողի հաջորդ խմբաքանակը սկսվում է ջրային նշանից հետո, ուստի տողը մնում է կուրսորի հետևում և երբեք չի ընտրվի։

Ոչինչ սխալ չի գրանցում, որովհետև ոչինչ չի ձախողվել։ Սա է այս դասի սխալը թանկ դարձնում. դելտա հոսքը արագ է, տողերի քանակը հավատալի է թվում, և բացակայող տողը շաբաթներ անց ի հայտ է գալիս որպես համաձայնեցման տոմս, որը ոչ ոք չի կարող վերարտադրել։

Հերթական համարներն ունեն նույն ձևի արատ այլ պատճառով։ Մոնոտոն ID-ն ասում է արժեքների բաշխման հերթականությունը, ոչ գործարքների commit-ի հերթականությունը։ Ցածր համար վերցրած գործարքը կարող է commit լինել բարձր համար վերցրածից հետո, ուստի բաշխման կարգի վրա հիմնված կուրսորը նույնպես կարող է անցք թողնել։

Հինգ խոստում, որ հոսքը պետք է տա

Տրանսպորտ ընտրելուց առաջ աղբյուր համակարգից պահանջեք հինգ կետից բաղկացած պայմանագիր։ Եթե որևէ կետ բացակայում է, ունեք էվրիստիկա, ոչ թե փոփոխությունների հոսք։

  • Ծածկույթ. ներդրումներ, թարմացումներ և ջնջումներ, յուրաքանչյուրը կիրառման համար անհրաժեշտ կայուն բանալիով։
  • Սահման. ինչ է նշանակում կուրսորի արժեքը և ինչ է պարունակում հետևողական խմբաքանակը։
  • Հետևողականություն. ինչպես են կապված աղյուսակները կարդացվում առանց անհամատեղելի աղբյուրի վիճակներ խառնելու։
  • Պահպանում. որքան ժամանակ անջատված սպառողը կարող է վերսկսել իր պահված դիրքից։
  • Վերաինիցիալիզացիա. աջակցվող ամբողջական snapshot, երբ այդ դիրքն այլևս վավեր չէ։

Աջակցվող մեխանիզմը կարող է բավարարել բոլոր հինգը։ SQL Server-ի փոփոխությունների հետագծման փաստաթղթերը մեկ կոնկրետ հրապարակված օրինակ են. այն սահմանում է նվազագույն վավեր տարբերակ, գրանցում է ջնջումները և փոփոխությունները, և նկարագրում է snapshot գործարք, որն ընդգրկում է վավերացումը, տարբերակի գրավումը և կապված փոփոխությունների հարցումները։ Սա օրինակ է, թե ինչ պահանջել աղբյուրից, ոչ թե շարահյուսություն, որը կարելի է տեղադրել այլ շարժիչում։

Նախագծեք անցակետը որպես խողովակաշարի մաս

Սպառողի պահված դիրքը իրական վիճակի մեքենան է, ուստի այն այդպես էլ գրեք։ Կուրսորը կարող է առաջ շարժվել միայն այն աշխատահոսքով, որն արդեն կիրառել է խմբաքանակը և commit արել թիրախ գործարքը։

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

Եթե առաքումը ձախողվում է կես ճանապարհին, համաձայնեցրեք նույն խմբաքանակը՝ նոր աղբյուրի դիրք հորինելու փոխարեն։ Ավելի թարմ վերին սահմանով վերահանումը այն ուղին է, որով մասնակի կիրառումը դառնում է մշտական բացվածք։ Հայելու կանոնը գործում է նաև մյուս կողմում. թիրախում իդեմպոտենտ կիրառումը կանխում է կրկնօրինակները և ոչինչ չի անում այն փոփոխության համար, որը հանումը երբեք չի տեսել։

Ջնջումներին պետք են գրառումներ, ոչ եզրակացություններ

Դեռ գոյություն ունեցող տողերի համեմատությունը չի կարող սպառողին ասել, թե որ բանալիներն անհետացան։ Աղբյուրը, որը երբեք չի գրանցում ջնջումներ, ձեզ թողնում է երկու թերի տարբերակ՝ բավական երկար պահել բանալիների պատմությունը diff-ի համար, կամ ըստ ժամանակացույցի կատարել բացահայտ ամբողջական համաձայնեցում։ Երկուսն էլ ծախսով նախագծային որոշումներ են, և ոչ մեկը գոյություն չունի, եթե ինչ-որ մեկը չի տիրապետում դրան։

Պահպանումը նույն տեսակի որոշումն է։ Յուրաքանչյուր աջակցվող փոփոխությունների հոսք ունի պատուհան. նշեք այն պայմանագրում և զգուշացրեք, երբ սպառողի անցակետը մոտենում է դրան։ Երկշաբաթյա ընդհատումից հետո արթնացող սպառողը պետք է կարդա հստակ սխալ՝ «վերաինիցիալիզացիա է պահանջվում», այլ ոչ թե լուռ ստանա մասնակի խմբաքանակ։

Ապա չափեք՝ արդյոք դելտան արժեր

Յուրաքանչյուր բանալի և hash համեմատելուն վերադառնալը երբեմն ճիշտ է, և արժե իմանալ, թե ինչ արժե։ Դուք դեռ փոխանցում եք տեղեկություն յուրաքանչյուր տողի մասին, hash-երը միջաղյուսակային հետևողական snapshot չեն տալիս, և hash սխեման բերում է իր հարցերը ներկայացման և բախումների մասին։ Ավելի քիչ բայթ՝ ստուգելի սահմանով, նպատակն է. ավելի քիչ բայթ, որոնք լուռ կորցնում են commit արված փոփոխությունը, ամենևին դելտա չէ։

Վերջին փոփոխության սյունակը հուշում է։ Կուրսորը, որը վերապրում է ուշ commit, ջնջում և երկար ընդհատում, պայմանագիր է։

Առնչվող հոդվածներ