Schreiwen iwwer Regiounen: wou gëtt d'Ännerung tatsächlech bestätegt?
Routing bréngt eng Demande an eng Regioun; nëmmen eng Transaktiounsgrenz mécht Schreiwen atomar. Nennt d'Invariant, wielt den Eegentemer, an entwërft dann de Widderhuelversuch ronderëm.
Zwee Applikatiounsserveren an zwou Regiounen, ee Client deen iwwer eng VPN schreift, an eng Fro déi kee opgeschriwwen huet: wéi eng Komponent entscheet, datt d'Schreiwen geschitt ass? Routing bréngt d'Demande zu engem Prozess. Eng Transaktiounsgrenz entscheet, wéini d'Ännerung dauerhaft a sichtbar gëtt. Dat sinn ënnerschiddlech Aarbechten déi vun ënnerschiddleche Systemer gemaach ginn, an d'Lück tëschent hinnen ass do wou déi meescht Feeler beim Schreiwen iwwer Regiounen wunnen.
Fänkt mat der Geschäftsregel un, net mat der Kaart
Fänkt mat engem Saz iwwer d'Geschäftsregel un an net iwwer d'Geografie: wéi eng Liesungen a Schreiwen mussen zesumme geléngen, a wéi eng gläichzäiteg Ännerungen mussen onméiglech sinn, während dat geschitt. Bei enger Bestandsreservatioun heescht dat, datt d'Bestandspréifung an d'Reservatioun entweder allebéid a Kraaft trieden oder keng, an datt keng zweet Bestellung d'selwecht Eenheet tëschenduerch verbrauche kann.
| 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 |
Genau déi mëttelst Zeil sprange Teams iwwer. Atomaritéit ouni genuch Isolatioun erlaabt zwou Transaktiounen, sech alleng korrekt ze bestätegen an trotzdem en Zoustand ze produzéieren, deen d'Geschäft als onméiglech betruecht, an dat gëtt duerno duerch keng Widderhuelversuchslogik reparéiert.
Eng autoritativ Grenz schléit zwee regional Serveren
Regional Applikatiounsservere kënnen do bleiwen wou se sinn, soulaang se d'Operatioun un en Service ginn, deen se bannent enger eenzeger ënnerstëtzter Transaktiounsgrenz ausféiert. D'Applikatiounsschicht gëtt en Router vum Wëllen; d'Datenschicht besëtzt d'Wourecht.
Halt déi Grenz kuerz a no bei den Daten déi se beréiert. Eng Transaktioun, déi oppe bleift während en Mënsch eng Ufro beäntwert, oder während en Uruff zwou Regiounen iwwerquier, verbréngt hir Zäit domat, Späre festzehalen an d'Chance ze erhéijen, datt eppes anescht hannert hir an en Timeout leeft. Dee Feeler gesäit aus wéi e Datebankproblem an ass tatsächlech e Designproblem deen sech esou verkleet huet. D'Entscheedung an d'Datenschicht ze verleeën eliminéiert en normalerweis komplett.
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;
Liest dee Skizz als Grenz, net als Leeschtungsempfehlung. De Punkt ass, datt d'Préifung an d'Einfügen ee Bestätegen deelen, sou datt eng gläichzäiteg Bestellung de Bestand entweder verbraucht gesäit oder guer net gesäit.
Wat eng replizéiert Datebank gëtt a wat net
Eng replizéiert Datebank kann eng méi breet Grenz ubidden, wa säin eegent Transaktiounsmodell dat ënnerstëtzt. Spanner dokumentéiert atomar Liese-Schreif-Transaktiounen bannent enger eenzeger Datebank iwwer Tabellen, mat definéierter Isolatioun a Widderhuelverhalen. Dat ass eng Garantie déi een liest, testt an duerch bewosst drop verléit.
Et ass och eng Garantie déi vum Produkt kënnt, net vun der Streck. Eng VPN tëschent Regiounen ännert wéi Pakete reesen a wéi Feeler sech weisen. Et verlängert eng Transaktiounsgrenz net em eng eenzeg Zeil, egal wéi gesond den Tunnel ausgesäit. Déi zwou ze verwiesselen erzeugt Architekturen an deenen all Komponent seng eegen Préifung besteet an d'Daten awer net iwwerenee stëmmen.
Zwou Datebanke gi keen eenzegt System
Zwou onofhängeg verwaltete Datebanke kréien keen gedeelte Transaktiounsmanager just well Clienten op béid kënnen zougräifen. Wann d'Geschäft wierklech eng atomar Verflichtung iwwer de Puer brauch, mussen de Koordinatiounsmechanismus, d'Participanten an de Recuperatiounsprozess alleguer gewielt a qualifizéiert ginn, an net ugeholl.
Denkt un de Moment wou en Participant oder eng Verbindung verschwënnt nodeems d'Aarbecht preparéiert gouf. Eng ënnerstëtzte verdeelt Bestätegung kann en onsécheren Zoustand hannerloossen, deen eng Recuperatiounsprozedur an eng mënschlech Entscheedung brauch, an et kënnt ouni d'Versprieche datt all Regioun duerch all Partition beschreifbar bleift.
Wann amplaz asynchron Koordinatioun akzeptabel ass, sot et explizit a schreift déi mëttel Geschäftszoustänn plus d'Ofgläichregelen op. Eng Kette vu lokal bestätegte Schrëtt mat Kompensatioun ass en legitime Design; et ass just keng eenzeg atomar Transaktioun ënner engem aneren Numm.
Entwërft de Widderhuelversuch virum éischte Stéierfall
E Client kann d'Äntwert verléieren nodeems d'Operatioun bestätegt gouf, dofir kann den Opruffer en Timeout net als Feeler behandelen. Erhaalt eng dauerhaft Demande-Identitéit an notzt d'Resultat vum Service oder en Idempotenzmechanismus ier eng Mutatioun widderholl gëtt, soss gëtt de Widderhuelversuch en zweet Schreiwen.
Automatesch Transaktiouns-Callbacks kënnen och méi wéi eemol lafen nodeems en widderhuelbaren Ofbroch, watse se zu engem schlechten Doheem fir onëmkéierbar extern Effekter mécht. Halt déi ausserhalb vum Callback, ausser de Workflow definéiert en explizite séchere Protokoll fir se. Déiselwecht Virsiicht gëllt fir alles wat Geld kascht oder eng Noriicht schéckt. Eng duebel Belaaschtung ass eng vill méi schwéier Konversatioun wéi eng duebel Logzeil.
D'Abnahme soll véier Szenarië widderhollen: zwee Clienten déi ëm déiselwecht Zeil rennen, en Ofbroch deen de Service als widderhuelbar bezeechent, eng Bestätegung där hir Äntwert ni ukënnt, an de Verloscht vun enger Regioun oder der Verbindung tëschent hinnen. Halt dat bestätegt Geschäftsresultat an déi ongeléist Zoustänn nieft dem Routingdesign fest, damit keen d'Netz mam Komponent verwiesselt deen d'Garantie gëtt.