Table of Contents
Înțelegerea provocării coerenței datelor în serverele fără date
Serverele fără preţuri de utilizare, precum Amazon Dynamobb, Azure Cosmos DB şi Google Cloud Firestore oferă automat, preţuri de plată şi cheltuieli operaţionale reduse. Totuşi, natura lor distribuită introduce compromisuri fundamentale în consistenţa datelor. Când o aplicaţie citeşte datele imediat după ce le-a scris, utilizatorul se aşteaptă să vadă cea mai recentă valoare. Într-un sistem distribuit global, obţinerea acestei garanţii devine netriviabilă. Teorema CAP ne aminteşte că un magazin distribuit de date poate furniza doar două din cele trei garanţii: concordanţă, disponibilitate şi toleranţă parţială. Serviciile fără servere prioritizează de obicei disponibilitatea şi toleranţa la partiţie, oferind consistenţă Eventual prin implicit. Înţelegerea acestui comerţ este primul pas către aplicarea de încredere arhitectură.
Consistenţa datelor nu este o proprietate unică-se potrivește tuturor.O muncă diferită necesită garanții diferite.De exemplu, un sistem de inventariere a comerțului electronic nu trebuie să supravînzeze niciodată elemente, care necesită o consistență puternică pentru actualizările stocurilor.O alimentare cu social-media, pe de altă parte, poate tolera câteva secunde de întârziere în timp ce un nou post propagează.Alegerea modelului de coerență și implementarea modelelor complementare corespunzătoare asigură că aplicația dvs. fără server se comportă previzibil în timp ce beneficiază de elasticitatea platformei.
Modele de coerență în magazine fără servere
Coerență puternică
Consistenţa puternică garantează că fiecare citire returnează cea mai recentă scriere. În sistemele fără servere, acest lucru se realizează adesea prin citirea din replica primară sau prin utilizarea protocoalelor bazate pe cvorum. Servicii precum suportul Dynamob ] citiri puternice (la un cost suplimentar şi latenţă) şi Azure Cosmos DB oferă consistenţă puternică pentru conturile distribuite la nivel global folosind replicarea multimaster. Utilizaţi o consistenţă puternică atunci când tranzacţiile financiare, autentificarea utilizatorilor sau sistemele de rezervare necesită o precizie absolută.
Coerența evenimentelor
Consistența evenimentelor este implicit pentru majoritatea magazinelor de date fără servere. Aceasta înseamnă că, dacă nu se scriu noi sunt făcute la un element de date, în cele din urmă (de obicei, în milisecunde sau secunde) toate replicile vor converge la aceeași valoare. Acest model oferă cea mai bună disponibilitate și latență cea mai mică. Este ideal pentru volumul de muncă citit-greu, cataloage de produse și sisteme de exploatare a lemnului unde citirile vechi sunt acceptabile pentru ferestre scurte.
Coerența cauzală
Consistenţa cauzală păstrează ordinea operaţiunilor legate de cauzalitate. Dacă operaţiunea A (actualizează imaginea profilului) se întâmplă înainte de operaţiunea B (postaţi un comentariu care face referire la această imagine), atunci orice observator va vedea A înainte de B. Acest model se află între consistenţă puternică şi eventual şi este susţinut de servicii precum Google Cloud Datastore. Este util pentru editarea colaborativă, feed-uri sociale şi aplicaţii de chat în cazul în care evenimente de comandă probleme.
Cele mai bune practici pentru menținerea coerenței
1. Selectaţi modelul de coerenţă adecvat pentru fiecare operaţiune
În loc să alegeţi un singur nivel de consistenţă pentru întreaga aplicaţie, proiectaţi fiecare operaţiune critică de citire sau de scriere cu propria cerinţă de consistenţă. În Dynamobb, puteţi specifica pentru fiecare individ sau apelurile în timp ce lăsaţi alte citiri în cele din urmă consistente. Această abordare hibridă echilibrează performanţa şi corectitudinea. Documentaţi-vă deciziile şi testaţi-le sub sarcină pentru a asigura latenţa rămâne în limite acceptabile.
2. Utilizați tranzacțiile distribuite cu Sagas sau două Phase Comite
Atunci când un proces de afaceri se întinde pe mai multe magazine de date sau servicii, aveţi nevoie de un mecanism pentru a menţine atomicitatea. Transacţii distribuite], cum ar fi angajamentul în două faze (2PC) Protocol .Acţiuni de compensare care fie se angajează sau se anulează împreună.Totuşi, 2PC poate fi lent şi reduce disponibilitatea.O alternativă este ]Saga model, în cazul în care fiecare operaţiune emite un eveniment care declanşează acţiuni compensatorii în cazul în care ceva nu reuşeşte.Multe platforme fără server oferă suport de tranzacţie încorporat: ]DinamobbB tranzacţii acoperă până la 25 acţiuni în mai multe elemente, în timp ce Cosmos DB sprijină operaţiunile de lot tranzacţional.
3. Punerea în aplicare a strategiilor de soluționare a conflictelor
În timp ce simplu, LWW poate pierde date în cazul în care ceasurile sunt în afara sincronizării. Pentru semantica mai bogată, utilizaţi vectori de conversie sau CRDTs (Tipuri de date Replicate Conflict-Free). DinamoDBs actualizări condiţionale şi câmpuri de versiune vă permit să implementaţi blocarea optimistă cu soluţionarea conflictelor personalizate. Cosmos DB oferă multiple politici de soluţionare a conflictelor, inclusiv proceduri personalizate stocate care îmbină versiunile de conflict.
4. Operaţiuni şi retensiuni cu împrumut de capital
Eşecurile de reţea sau erorile tranzitorii pot cauza retensiuni ale clienţilor, ceea ce ar putea duce la o prelucrare duplicată. Operaţiunile de proiectare vor fi idepotent elimină acest risc. De exemplu, atribuie o cheie unică de idempotenţă fiecărei cereri de scriere; serverul poate apoi deduplica cererile care împărtăşesc aceeaşi cheie. Multe servere fără suport SDK-uri idempotent scrie nativ. Combinaţi acest lucru cu exponenţial backoff şi jitter în logica retry pentru a reduce disputa şi menţine coerenţa fără a copleşi backend-ul.
5. Monitorizează integritatea datelor cu fluxuri de schimbare și audituri
Într-un mediu fără server, puteți utiliza change data capture (CDC) caracteristici precum Dynamobb Streams, Cosmos DB Change Feed, sau Firestore . Emitenții de date în timp real pentru a monitoriza toate modificările. Setați o funcție lambda sau cloud pentru a valida faptul că variabilele de date dețin după fiecare schimbare. De exemplu, o aplicație bancară poate subscrie la tranzacții de cont și verificați dacă soldul este întotdeauna egal cu suma de credite minus debite. audit regulat . . . . . Rulatura de audit regulat pe un program poate detecta drifty și declanșa activitatea corectivă.
6. Optimizarea replicarii datelor pentru cazul de utilizare
Replicarea globală îmbunătățește latența pentru utilizatorii din întreaga lume, dar crește fereastra pentru inconsistență. Configurați replicarea cu nivelul de consistență adecvat și luați în considerare utilizarea activă[ vs. activ-pasiv tovologii. Activă (multimaster) oferă o latență mai scăzută de scriere, dar necesită o soluționare robustă a conflictelor. Activ-pasiv (un singur primar cu replici citite) oferă o consistență mai puternică pentru scrieri în timp ce se mai servește citiri din cea mai apropiată replică. Servicii precum Cosmos DB permit alegerea din cinci niveluri bine definite de consistență, de la puternic la eventual, pentru a se potrivi obiectivelor de replicare late.
Modele arhitecturale care păstrează coerența
Segregarea responsabilității de comandă (CQRS)
CQRS separă modelele de modele citite, permițând fiecare să fie optimizat independent. Scrie merge la un magazin puternic consistent; citește provin din proiecții în cele din urmă consistente. Acest model este deosebit de puternic atunci când este combinat cu o event Source abordare, în cazul în care toate modificările de stat sunt stocate ca evenimente imuabile. Modelele citite pot fi reconstruite din jurnalul de eveniment, dacă apar probleme de consistență vreodată. Martin Fowler articol pe CQRS oferă o imagine de ansamblu excelentă.
Consistență de consistență și consistență eventuală
Evenimentul de aprovizionare stochează o secvenţă de evenimente în loc de starea actuală. Deoarece evenimentele sunt anexe numai şi imuabile, acestea sunt consistente în mod natural. Servicii precum Dynamobb sau Cosmos DB pot acţiona ca magazine de evenimente. Consumatorii procesează evenimente asincronaly, eventual construind modele citite. În cazul rar al unui conflict, puteţi reda fluxul de evenimente dintr-un punct de control cunoscut. Acest model asigură ]durabilitatea şi auditabilitatea în timp ce o face simplă pentru raţiunea cu privire la limitele consistenţei.
Model de ieșire pentru mesaje fiabile
Atunci când o funcție serverless scrie într-o bază de date și apoi trimite un mesaj la o coadă, cele două operațiuni nu pot fi atomice. Modelul de ieșireoutbox rezolvă acest lucru prin stocarea mesajului în aceeași bază de date în cadrul aceleiași tranzacții. Un proces separat (cum ar fi un procesor flux) citește outbox și publică mesajul. Aceasta garantează că baza de date scrie și mesajul trimis sunt atât angajate, cât și ambele laminate înapoi, păstrarea coerenței între servicii. Furnizorii SaaS cum ar fi ]AWS bine arhitecți descriu modelul de ieșire în detaliu.
Manipularea cazurilor speciale: Geo-Distribution și Offline Writes
Aplicaţiile mobile şi IoT funcţionează adesea offline şi sincronizează mai târziu. SDK-urile vânzătorilor fără server oferă persistenţă offline cu sincronizare care se ocupă de conflicte prin soluţionări personalizate ale conflictelor. De exemplu, AWS AppSync cu DynamobB pot fuziona versiuni bazate pe ştampile temporale sau logica definită de client. Atunci când se utilizează astfel de biblioteci, întotdeauna se testează logica soluţionării conflictelor în condiţii de reţea din lumea reală şi se monitorizează numărul de conflicte.
Pentru consistența multiregiunilor, utilizați grupuri de consistență atunci când este posibil, conceptul susținut de Cosmos DB care grupează elementele aferente, astfel încât acestea să fie întotdeauna reproduse împreună. Aceasta împiedică scenariile în care imaginea profilului utilizatorului se actualizează în regiunea A, dar actualizarea lor biologică (în același grup) nu a ajuns încă în regiunea B.
Strategii de testare și validare
Coerența bug-uri de multe ori suprafață numai sub sarcini distribuite. Scrieți teste de integrare care rulează împotriva unui emulator real fără server sau caz de cloud și simulați scrie și citește simultan. Instrumente ca Jepsen poate verifica că magazinul de date se comportă corect în cadrul partițiilor de rețea. Pentru producție, implementați aplicații canare și mutați treptat traficul pe noi căi de cod în timp ce monitorizați indicatorii de coerență.Definiți SLA-uri pentru stileness (vârsta maximă acceptabilă a datelor citite) și măsurați-le cu tranzacții sintetice.
Rezumat
Consistenţa datelor în serverele de date fără caracter necesită alegeri arhitecturale deliberate. Prin înţelegerea modelelor de consistenţă disponibile, prin utilizarea tranzacţiilor distribuite sau a modelului de saga, proiectarea operaţiunilor idempotente şi pârghie mecanisme de soluţionare a conflictelor, puteţi construi aplicaţii care sunt atât scalabile cât şi fiabile. Monitorizează sistemul dumneavoastră de garanţii de consistenţă prin fluxuri de schimbare şi audituri, şi adoptă modele precum CQRS, Event Outbox, şi modelul de ieşire pentru a menţine integritatea peste limitele de servicii. Cu aceste bune practici, serverele dvs. backend va oferi o experienţă coerentă, corectă utilizatorilor săi săi, chiar şi pentru a gestiona traficul global.