Skryf oor streke heen: waar beland die commit werklik?
Roetering bring ’n versoek by ’n streek; net ’n transaksiegrens maak skryf atomies. Benoem die invariant, kies die eienaar en ontwerp dan die herprobeer daarom.
Twee toepassingsbedieners in twee streke, een kliënt wat deur ’n VPN skryf, en ’n vraag wat niemand neergeskryf het nie: watter komponent besluit dat die skryf plaasgevind het? Roetering kry die versoek by ’n proses. ’n Transaksiegrens besluit wanneer die verandering duursaam en sigbaar word. Dit is verskillende take wat deur verskillende stelsels uitgevoer word, en die gaping tussen hulle is waar die meeste meerstreekse skryffoute woon.
Begin by die besigheidsreël, nie by die kaart nie
Begin met ’n sin oor die besigheidsreël eerder as oor geografie: watter lees en skryf moet saam slaag, en watter gelyktydige veranderinge onmoontlik moet wees terwyl dit gebeur. Vir ’n voorraadbespreking beteken dit die voorraadkontrole en die bespreking tree óf albei in werking óf nie een nie, en geen tweede bestelling mag dieselfde eenheid intussen verbruik nie.
| 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 |
Daardie middelste ry is die een wat spanne oorslaan. Atomisiteit sonder voldoende isolasie laat twee transaksies elk korrek commit en steeds ’n toestand lewer wat die besigheid as onmoontlik beskou, en geen hoeveelheid herprobeer-logika maak dit daarna reg nie.
Een gesaghebbende grens klop twee streeksbedieners
Streeks-toepassingsbedieners kan bly waar hulle is, solank hulle die bewerking indien by ’n diens wat dit binne ’n enkele ondersteunde transaksiegrens uitvoer. Die toepassingsvlak word ’n roeteerder van bedoeling; die datavlak besit die waarheid.
Hou daardie grens kort en naby die data wat dit raak. ’n Transaksie wat oopgehou word terwyl ’n mens ’n opdrag beantwoord, of terwyl ’n oproep twee streke kruis, bestee sy tyd aan die hou van slotte en verhoog die kans dat iets anders agter dit uittyd. Daardie mislukking lyk soos ’n databasisprobleem en is eintlik ’n ontwerpprobleem wat soos een aangetrek is. Om die besluit na die datavlak te skuif, verwyder dit gewoonlik heeltemal.
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;
Lees daardie skets as ’n grens, nie as ’n prestasieaanbeveling nie. Die punt is dat die kontrole en die invoeging een commit deel, so ’n gelyktydige bestelling sien óf die voorraad verbruik óf sien dit glad nie.
Wat ’n gerepliseerde databasis gee en nie gee nie
’n Gerepliseerde databasis kan ’n wyer grens bied wanneer sy eie transaksiemodel dit ondersteun. Spanner dokumenteer atomiese lees-skryf-transaksies binne ’n enkele databasis oor tabelle heen, met gedefinieerde isolasie en herprobeergedrag. Dit is ’n waarborg wat jy lees, toets en doelbewus op vertrou.
Dit is ook ’n waarborg wat van die produk kom, nie van die roete nie. ’n VPN tussen streke verander hoe pakkette reis en hoe foute hulself wys. Dit verleng nie ’n transaksiegrens met ’n enkele ry nie, maak nie saak hoe gesond die tonnel lyk nie. Om die twee te verwar lewer argitekture waar elke komponent sy eie kontrole slaag en die data steeds verskil.
Twee databasisse word nie een stelsel nie
Twee onafhanklik bestuurde databasisse kry nie ’n gedeelde transaksiebestuurder omdat kliënte albei kan bereik nie. As die besigheid werklik atomiese toewyding oor die paar nodig het, moet die koördineringsmeganisme, die deelnemers en die herstelproses alles gekies en gekwalifiseer word eerder as aangeneem.
Dink aan die oomblik wanneer ’n deelnemer of ’n skakel verdwyn nadat werk voorberei is. ’n Ondersteunde verspreide commit kan ’n onsekere toestand laat wat ’n herstelprosedure en ’n menslike besluit nodig het, en dit kom met geen belofte dat elke streek deur elke partisie skryfbaar bly nie.
As asinchrone koördinering eerder aanvaarbaar is, sê dit uitdruklik en skryf die tussenliggende besigheidstoestande plus die versoeningreëls neer. ’n Ketting van plaaslik toegewyde stappe met kompensasie is ’n geldige ontwerp; dit is bloot nie een atomiese transaksie wat ’n ander naam dra nie.
Ontwerp die herprobeer voor die eerste onderbreking
’n Kliënt kan die antwoord verloor nadat die bewerking commit het, so die oproeper kan nie ’n tydverstreke as ’n mislukking beskou nie. Bewaar ’n duursame versoekidentiteit en gebruik die diensuitkoms of idempotensiemeganisme voordat ’n wysiging herprobeer word, anders word die herprobeer ’n tweede skryf.
Outomatiese transaksie-terugroepe kan ook meer as een keer uitgevoer word na ’n herprobeerbare abortering, wat hulle ’n swak tuiste maak vir onomkeerbare eksterne effekte. Hou dié buite die terugroep tensy die werkstroom ’n uitdruklike veilige protokol daarvoor definieer. Dieselfde versigtigheid geld vir enigiets wat geld kos of ’n boodskap stuur. ’n Dubbele heffing is ’n veel moeiliker gesprek as ’n dubbele logreël.
Aanvaarding moet vier scenario’s herspeel: twee kliënte wat vir dieselfde ry jaag, ’n abortering wat die diens sê herprobeer kan word, ’n commit waarvan die antwoord nooit opdaag nie, en die verlies van ’n streek of die skakel tussen hulle. Teken die toegewyde besigheidsresultaat en die onopgeloste toestande langs die roeteringontwerp aan, sodat niemand die netwerk vir die komponent aansien wat die waarborg verskaf nie.