Mitme piirkonna kirjutamine: kuhu muudatus tegelikult kinnitatakse?
Marsruutimine viib päringu piirkonda; kirjutise teeb atomaarseks alles tehingu piir. Nimetage invariant, valige omanik ja kujundage seejärel korduskatse selle ümber.
Kaks rakenduseserverit kahes piirkonnas, üks klient, kes kirjutab VPN-i kaudu, ja küsimus, mida keegi kirja ei pannud: milline komponent otsustab, et kirjutis toimus? Marsruutimine viib päringu protsessini. Tehingu piir otsustab, millal muudatus muutub püsivaks ja nähtavaks. Need on erinevad tööd, mida teevad erinevad süsteemid, ja nendevaheline lõhe on koht, kus elab enamik mitme piirkonna kirjutiste vigu.
Alustage ärireeglist, mitte kaardist
Alustage lausega ärireegli, mitte geograafia kohta: millised lugemised ja kirjutised peavad koos õnnestuma ja millised samaaegsed muudatused peavad selle ajal olema võimatud. Laos tehtava broneeringu puhul tähendab see, et laoseisukontroll ja broneering kas mõjuvad mõlemad või mitte kumbki, ja ükski teine tellimus ei tohi vahepeal sama ühikut ära kasutada.
| 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 |
Just selle keskmise rea jätavad meeskonnad vahele. Atomaarsus ilma piisava isolatsioonita lubab kahel tehingul mõlemal korrektselt kinnituda ja siiski tekitada oleku, mida äri peab võimatuks, ja miski kogus korduskatse loogikat ei paranda seda hiljem.
Üks volitatud piir võidab kaks piirkondlikku serverit
Piirkondlikud rakenduseserverid võivad jääda sinna, kus nad on, kui nad esitavad operatsiooni teenusele, mis sooritab selle ühe toetatud tehingu piiri sees. Rakenduskiht muutub kavatsuse marsruuteriks; andmekiht omab tõde.
Hoidke see piir lühike ja lähedal andmetele, mida see puudutab. Tehing, mis hoitakse lahti, kui inimene vastab viibale või kui kutse läbib kahte piirkonda, kulutab oma aja lukkude hoidmisele ja suurendab tõenäosust, et midagi muud selle taga aegub. See tõrge näeb välja nagu andmebaasi probleem ja on tegelikult disainiprobleem, mis on end selliseks riietanud. Otsuse viimine andmekihti eemaldab selle tavaliselt täielikult.
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;
Lugege seda visandit piirina, mitte jõudluse soovitusena. Mõte on selles, et kontroll ja sisestus jagavad ühte kinnitust, seega samaaegne tellimus kas näeb laoseisu kulutatud või ei näe seda üldse.
Mida replikeeritud andmebaas annab ja mida mitte
Replikeeritud andmebaas võib pakkuda laiemat piiri, kui selle enda tehingumudel seda toetab. Spanner dokumenteerib atomaarsed lugemis-kirjutustehingud ühe andmebaasi sees üle tabelite, määratletud isolatsiooni ja korduskatse käitumisega. See on garantii, mida loete, testite ja millele teadlikult toetute.
See on ka garantii, mis tuleb tootest, mitte marsruudist. VPN piirkondade vahel muudab seda, kuidas paketid liiguvad ja kuidas tõrked end näitavad. See ei pikenda tehingu piiri ühegi rea võrra, ükskõik kui terve tunnel ka paistab. Nende kahe segamine tekitab arhitektuure, kus iga komponent läbib oma kontrolli ja andmed on endiselt vastuolus.
Kaks andmebaasi ei saa üheks süsteemiks
Kaks sõltumatult hallatavat andmebaasi ei saa ühist tehinguhaldurit sellepärast, et kliendid pääsevad mõlemani. Kui äri tõesti vajab atomaarset kohustust üle selle paari, tuleb koordineerimismehhanism, osalejad ja taastamisprotsess kõik valida ja kvalifitseerida, mitte eeldada.
Mõelge hetkele, mil osaleja või link kaob pärast töö ettevalmistamist. Toetatud hajutatud kinnitus võib jätta ebakindla oleku, mis vajab taastamisprotseduuri ja inimlikku otsust, ja see ei tõota, et iga piirkond jääb iga jagunemise ajal kirjutatavaks.
Kui selle asemel on vastuvõetav asünkroonne koordineerimine, öelge seda selgesõnaliselt ja kirjutage üles vahepealsed äriolekud pluss lepitamisreeglid. Ahel lokaalselt kinnitatud samme koos kompensatsiooniga on legitiimne disain; see lihtsalt ei ole üks atomaarne tehing teise nime all.
Kujundage korduskatse enne esimest katkestust
Klient võib vastuse kaotada pärast operatsiooni kinnitamist, seega ei saa kutsuja aegumist tõrkeks pidada. Säilitage püsiv päringu identiteet ja kasutage enne muudatuse kordamist teenuse tulemust või idempotentsusmehhanismi, muidu muutub korduskatse teiseks kirjutiseks.
Automaatsed tehingu tagasikutsumised võivad samuti pärast korratavat katkestust käivituda rohkem kui üks kord, mis teeb neist halva kodu pöördumatutele välistele mõjudele. Hoidke need tagasikutsumisest väljas, kui töövoog ei määra neile selgesõnalist turvalist protokolli. Sama ettevaatus kehtib kõige kohta, mis maksab raha või saadab sõnumi. Topeltarvestus on palju raskem vestlus kui topelt logirida.
Vastuvõtt peaks kordama nelja stsenaariumi: kaks klienti, kes võistlevad sama rea pärast, katkestus, mille kohta teenus ütleb, et seda saab korrata, kinnitus, mille vastus ei saabu kunagi, ja piirkonna või nendevahelise lingi kaotus. Kirjutage kinnitatud äritulemus ja lahendamata olekud marsruutimise disaini kõrvale, et keegi ei ajaks võrku segamini komponendiga, mis garantii annab.