Budur iki fərqli mühərrikdə iki dəfə gördüyüm bir nasazlıq. Eksport 10:00-da işləyir və gördüyü ən yüksək son dəyişdirilmə vaxt damğasını qeyd edir. 09:58-də başlayan bir tranzaksiya hələ açıqdır, 10:03-də commit edilir və başladığı andan vaxt damğası daşıyır. Növbəti eksport yalnız 10:00-dan yeni sətirləri istəyir və onu heç vaxt görmür. Ötürmə həcmi əla idi, məlumat isə səhv.

Bir sətri itirən eksportu izləyin

SQL-i deyil, hadisələrin ardıcıllığını izləyin. Tətbiq sətrin dəyişdirilmə vaxtını tranzaksiya commit edəndə deyil, başlayanda yazır. Eksportor həmin tranzaksiya hələ açıq ikən divar saatı üzrə su nişanını oxuyur. Sonra tranzaksiya saxlanılan su nişanından daha köhnə dəyişdirilmə vaxtı ilə commit edilir. İstehlakçının növbəti paketi su nişanından sonra başlayır, yəni sətir kursorun arxasında qalır və bir daha heç vaxt seçilmir.

Heç nə xəta qeyd etmir, çünki heç nə uğursuz olmadı. Bu sinif xətanı bahalı edən də elə budur: delta axını sürətlidir, sətir sayları inandırıcı görünür və itkin sətir həftələr sonra heç kimin təkrar edə bilmədiyi uyğunlaşdırma bileti kimi üzə çıxır.

Ardıcıllıq nömrələri fərqli səbəbdən eyni formalı qüsura malikdir. Monoton ID sizə dəyərlərin hansı sıra ilə ayrıldığını deyir, tranzaksiyaların hansı sıra ilə commit edildiyini yox. Aşağı nömrə götürən tranzaksiya yüksək nömrə götürəndən sonra commit edə bilər, ona görə ayrılma sırasına əsaslanan kursor da boşluq buraxa bilər.

Axının verməli olduğu beş vəd

Nəqliyyat seçməzdən əvvəl mənbə sistemdən beş bəndlik müqavilə istəyin. Hər hansı bənd çatışmırsa, əlinizdə dəyişiklik axını deyil, evristika var.

  • Əhatə: əlavələr, yeniləmələr və silmələr, hər biri tətbiq üçün lazım olan sabit açarı ilə.
  • Sərhəd: kursor dəyərinin nə demək olduğu və ardıcıl paketin nəyi ehtiva etdiyi.
  • Uyğunluq: əlaqəli cədvəllərin uyğunsuz mənbə vəziyyətlərini qarışdırmadan necə oxunduğu.
  • Saxlama: əlaqəsi kəsilmiş istehlakçının saxlanılan mövqedən nə qədər müddət davam edə biləcəyi.
  • Yenidən başlatma: həmin mövqe artıq keçərli olmadıqda dəstəklənən tam snapshot.

Dəstəklənən mexanizm beşinin hamısını ödəyə bilər. SQL Server-in dəyişiklik izləmə sənədləri konkret nəşr olunmuş bir nümunədir: minimum keçərli versiyanı təyin edir, dəyişikliklərlə yanaşı silmələri də qeyd edir və doğrulama, versiya tutma və əlaqəli dəyişiklik sorğularını əhatə edən snapshot tranzaksiyasını təsvir edir. Bu, mənbədən tələb etməli olduğunuz şeyin nümunəsidir, başqa mühərrikə yapışdıra biləcəyiniz sintaksis deyil.

Yoxlama nöqtəsini boru xəttinin hissəsi kimi dizayn edin

İstehlakçının saxlanılan mövqeyi əsl vəziyyət maşındır, ona görə onu belə yazın. Kursor yalnız paketi artıq tətbiq etmiş və hədəf tranzaksiyanı commit etmiş iş axını vasitəsilə irəliləyə bilər.

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

Çatdırılma yarıda uğursuz olarsa, yeni mənbə mövqeyi uydurmaq əvəzinə həmin paketi uzlaşdırın. Daha təzə yuxarı sərhədlə yenidən çıxarmaq qismən tətbiqin daimi boşluğa çevrilmə yoludur. Güzgü qaydası o biri tərəfdə də keçərlidir: hədəfdə idempotent tətbiq dublikatların qarşısını alır və çıxarmanın heç görmədiyi dəyişiklik üçün heç nə etmir.

Silmələr nəticə deyil, qeyd tələb edir

Hələ mövcud olan sətirləri müqayisə etmək istehlakçıya hansı açarların yox olduğunu deyə bilməz. Silmələri heç qeyd etməyən mənbə sizi iki qeyri-kamil seçimlə qoyur: müqayisə üçün kifayət qədər uzun açar tarixçəsi saxlamaq və ya cədvəl üzrə açıq tam uzlaşdırma aparmaq. Hər ikisi xərci olan dizayn seçimidir və heç biri kiminsə sahib çıxmadığı halda mövcud deyil.

Saxlama da eyni cür qərardır. Hər dəstəklənən dəyişiklik axınının pəncərəsi var; bunu müqavilədə göstərin və istehlakçının yoxlama nöqtəsi ona yaxınlaşdıqda xəbərdarlıq edin. İki həftəlik fasilədən sonra oyanan istehlakçı səssizcə qismən paket almaq əvəzinə aydın "yenidən başlatma tələb olunur" xətası oxumalıdır.

Sonra ölçün: delta buna dəyərdimi

Hər açarı və heşi müqayisə etməyə qayıtmaq bəzən doğrudur və bunun nəyə başa gəldiyini bilməyə dəyər. Siz yenə hər sətir haqqında məlumat ötürürsünüz, heşlər sizə cədvəllər arası ardıcıl snapshot vermir və heş sxemi özünün təqdimat və toqquşma suallarını gətirir. Məqsəd yoxlanıla bilən sərhədlə daha az bayt; səssizcə commit edilmiş dəyişikliyi atan daha az bayt isə ümumiyyətlə delta deyil.

Son dəyişdirilmə sütunu bir işarədir. Gec commit-ə, silməyə və uzun fasiləyə tab gətirən kursor isə müqavilədir.

Əlaqəli məqalələr