Daugiaregis rašymas: kur iš tikrųjų įvyksta patvirtinimas?
Maršrutizavimas nuveda užklausą į regioną; tik transakcijos riba daro rašymą atominiu. Įvardykite invariantą, pasirinkite savininką, o tada suprojektuokite pakartojimą aplink jį.
Du programos serveriai dviejuose regionuose, vienas klientas, rašantis per VPN, ir klausimas, kurio niekas neužrašė: kuri komponentė nusprendžia, kad rašymas įvyko? Maršrutizavimas nuveda užklausą į procesą. Transakcijos riba nusprendžia, kada pakeitimas tampa ilgalaikis ir matomas. Tai skirtingi darbai, kuriuos atlieka skirtingos sistemos, ir tarpas tarp jų yra vieta, kur gyvena dauguma daugiaregio rašymo klaidų.
Pradėkite nuo verslo taisyklės, o ne nuo žemėlapio
Pradėkite sakiniu apie verslo taisyklę, o ne apie geografiją: kurie skaitymai ir rašymai turi pavykti kartu ir kurie lygiagretūs pakeitimai turi būti neįmanomi tai vykstant. Atsargų rezervacijai tai reiškia, kad atsargų patikrinimas ir rezervacija arba abu įsigalioja, arba nė vienas, ir joks antras užsakymas negali tarp to suvartoti to paties vieneto.
| Requirement | What satisfies it | What does not |
|---|---|---|
| All-or-nothing application | A transaction inside one owning system | A VPN path between regions |
| No double spend | Isolation strong enough to exclude the conflict | Atomicity alone |
| Survive a region loss | Replication the database itself documents | Two independent databases behind one client |
Kaip tik šią vidurinę eilutę komandos praleidžia. Atomiškumas be pakankamos izoliacijos leidžia dviem transakcijoms kiekvienai teisingai patvirtinti ir vis tiek sukurti būseną, kurią verslas laiko neįmanoma, ir jokia pakartojimo logika to vėliau nepataiso.
Viena autoritetinga riba nugali du regioninius serverius
Regioniniai programos serveriai gali likti ten, kur yra, jei operaciją perduoda paslaugai, kuri ją atlieka vienoje palaikomoje transakcijos riboje. Programos sluoksnis tampa ketinimo maršrutizatoriumi; duomenų sluoksnis valdo tiesą.
Laikykite tą ribą trumpą ir arti duomenų, kuriuos ji liečia. Transakcija, laikoma atidaryta, kol žmogus atsako į užklausą arba kol skambutis kerta du regionus, savo laiką leidžia laikydama užraktus ir didindama tikimybę, kad kažkas kita už jos baigs laiką. Ta nesėkmė atrodo kaip duomenų bazės problema ir iš tiesų yra taip persirengusi projektavimo problema. Sprendimo perkėlimas į duomenų sluoksnį paprastai ją visiškai pašalina.
BEGIN;
UPDATE inventory SET reserved = reserved + 1
WHERE sku = 'A-100' AND available >= 1;
INSERT INTO reservation (sku, order_id) VALUES ('A-100', 'ord-9f');
COMMIT;
Skaitykite tą eskizą kaip ribą, o ne kaip našumo rekomendaciją. Esmė ta, kad patikrinimas ir įterpimas dalijasi vienu patvirtinimu, todėl lygiagretus užsakymas arba mato atsargas suvartotas, arba nemato jų visai.
Ką duoda ir ko neduoda replikuota duomenų bazė
Replikuota duomenų bazė gali suteikti platesnę ribą, kai jos pačios transakcijų modelis tai palaiko. Spanner dokumentuoja atomines skaitymo-rašymo transakcijas vienoje duomenų bazėje per lenteles, su apibrėžta izoliacija ir pakartojimo elgsena. Tai garantija, kurią skaitote, testuojate ir kuria sąmoningai remiatės.
Tai taip pat garantija, kuri kyla iš produkto, o ne iš maršruto. VPN tarp regionų keičia, kaip keliauja paketai ir kaip pasireiškia gedimai. Jis nepratęsia transakcijos ribos nė viena eilute, kad ir kaip sveikai atrodytų tunelis. Sumaišius abu, atsiranda architektūros, kuriose kiekviena komponentė praeina savo patikrinimą, o duomenys vis tiek nesutampa.
Dvi duomenų bazės netampa viena sistema
Dvi savarankiškai valdomos duomenų bazės neįgyja bendro transakcijų tvarkytuvo vien todėl, kad klientai gali pasiekti abi. Jei verslui tikrai reikia atominio įsipareigojimo per šią porą, koordinavimo mechanizmas, dalyviai ir atkūrimo procesas turi būti pasirinkti ir kvalifikuoti, o ne laikomi savaime suprantamais.
Pagalvokite apie akimirką, kai dalyvis arba ryšys dingsta po to, kai darbas buvo paruoštas. Palaikomas paskirstytas patvirtinimas gali palikti neapibrėžtą būseną, kuriai reikia atkūrimo procedūros ir žmogaus sprendimo, ir jis nežada, kad kiekvienas regionas išliks rašomas per kiekvieną padalijimą.
Jei vietoj to priimtinas asinchroninis koordinavimas, pasakykite tai aiškiai ir užrašykite tarpines verslo būsenas bei suderinimo taisykles. Vietoje patvirtintų žingsnių grandinė su kompensacija yra teisėtas sprendimas; tai tiesiog nėra viena atominė transakcija kitu pavadinimu.
Suprojektuokite pakartojimą prieš pirmąjį sutrikimą
Klientas gali prarasti atsakymą po to, kai operacija patvirtinta, todėl iškvietėjas negali laikyti skirtino laiko nesėkme. Išsaugokite ilgalaikį užklausos identitetą ir prieš kartodami pakeitimą naudokite paslaugos rezultatą arba idempotencijos mechanizmą, kitaip pakartojimas taps antru rašymu.
Automatiniai transakcijų atgaliniai iškvietimai taip pat gali įvykti daugiau nei kartą po pakartojamo nutraukimo, todėl jie yra prasta vieta negrįžtamiems išoriniams poveikiams. Laikykite juos už atgalinio iškvietimo ribų, nebent darbo eiga jiems apibrėžia aiškų saugų protokolą. Tas pats atsargumas galioja viskam, kas kainuoja pinigus arba siunčia žinutę. Dvigubas nurašymas yra daug sunkesnis pokalbis nei dviguba žurnalo eilutė.
Priėmimas turėtų peržaisti keturis scenarijus: du klientai lenktyniauja dėl tos pačios eilutės, nutraukimas, kurį paslauga vadina pakartojamu, patvirtinimas, kurio atsakymas niekada neatvyksta, ir regiono arba ryšio tarp jų praradimas. Užrašykite patvirtintą verslo rezultatą ir neišspręstas būsenas šalia maršrutizavimo projekto, kad niekas nesupainiotų tinklo su komponente, kuri teikia garantiją.