Table of Contents
Tietokantojen johdonmukaisuuden haasteiden ymmärtäminen palvelimissa
Serverless data stores kuten Amazon DynamoDB, Azure Cosmos DB, ja Google Cloud Firestore tarjoavat autoskaalauksen, maksu-käyttö hinnoittelun ja vähentää käyttökustannuksia. Kuitenkin niiden hajautettu luonne tuo mukanaan perustavanlaatuisia vaihtokauppoja tietojen johdonmukaisuuden. Kun sovellus lukee tietoja heti sen kirjoittamisen jälkeen, käyttäjä odottaa nähdä uusimman arvon. Maailmanlaajuisesti hajautettu järjestelmä, saavuttaa, että takuu tulee nontrivial. [CAP lause[] muistuttaa meitä siitä, että hajautettu datavarasto voi tarjota vain kaksi kolmesta takuusta: Johdonmukaisuus, Saatavuus, ja Partition Tolerance. Palvelimet tyypillisesti priorisoi saatavuus ja osion sietoa, tarjonta eventual johdonmukaisuus []]. Ymmärtäminen tämä kaupan pois on ensimmäinen askel kohti Arkkitehtiä luotettavia sovelluksia.
Tietojen johdonmukaisuus ei ole yhden koon sopii-kaikki ominaisuus. Eri työmäärät vaativat erilaisia takeita. Esimerkiksi, sähköisen kaupankäynnin varastojärjestelmä ei saa koskaan liikaa myy tuotteita, mikä vaatii vahvaa johdonmukaisuutta varastopäivityksiä. Sosiaalinen media syöte, toisaalta, voi kestää muutaman sekunnin viive, kun uusi post lisäys. Valitsemalla oikean johdonmukaisuuden malli ja täytäntöönpano täydentävät mallit varmistaa, että palvelimeton sovellus käyttäytyy ennustavasti samalla kun vielä hyötyä joustavuus alustan.
Johdonmukaisuusmallit palvelinkyvyttömissä kaupoissa
Vahva johdonmukaisuus
Vahva johdonmukaisuus takaa, että jokainen luku palauttaa uusimman kirjoituksen. Palvelimittomissa järjestelmissä tämä saavutetaan usein lukemalla pääkopiosta tai käyttämällä päätösvaltaisuutta vaativia protokollia. DynamoDB-tuen [ kaltaiset palvelut ovat vahvasti johdonmukaisia [ (lisäkustannuksissa ja viiveissä) ja Azure Cosmos DB tarjoaa vahvan johdonmukaisuuden maailmanlaajuisesti jaetuille tileille monimaster replikaatiolla. Käytä vahvaa johdonmukaisuutta, kun rahoitustoimet, käyttäjätunnistus tai varausjärjestelmät vaativat ehdotonta tarkkuutta.
Tapahtumakohtainen johdonmukaisuus
Eventual consenture is the resolution for most serverless data stores. Se tarkoittaa, että jos uusia kirjoituksia ei tehdä datakohteeseen, lopulta (yleensä millisekunnissa tai sekunteina) kaikki kopiot lähentyvät samaan arvoon. Tämä malli tarjoaa parhaan saatavuuden ja alhaisimman latenssin. Se on ihanteellinen luku-raskaan työmäärän, tuoteluetteloiden ja kirjautumisjärjestelmien kannalta, joissa state lukemat ovat hyväksyttäviä lyhyille ikkunoille.
Syy-seuraussuhde
Syy-seuraussuhde säilyttää syy-yhteyden toiminnan järjestyksen. Jos operaatio A (päivitysprofiilikuva) tapahtuu ennen operaatiota B (postittaa kommenttia, jossa viitataan kyseiseen kuvaan), niin kaikki tarkkailijat näkevät A:n ennen B:tä. Tämä malli istuu vahvan ja mahdollisen johdonmukaisuuden välissä ja sitä tukevat palvelut kuten []Google Cloud Datastore[. Se on hyödyllinen yhteistyöeditointiin, sosiaalisyötteisiin ja chat-sovelluksiin, joissa tapahtuma tilaa asioita.
Parhaat käytännöt johdonmukaisuuden säilyttämiseksi
1. Valitse asianmukainen johdonmukaisuusmalli jokaiselle operaatiolle
Sen sijaan, että valitsisit yhden johdonmukaisuuden tason koko sovelluksellesi, suunnittele jokainen kriittinen luku- tai kirjoitustoiminto omalla johdonmukaisuuden vaatimuksellaan. DynamoDB:ssä voit määrittää [] yksittäisille [ tai [] puheluille jättäen muut lukemat lopulta johdonmukaisesti. Tämä hybridilähestymistapa tasapainottaa suorituskykyä ja oikeellisuutta. Dokumentoi päätöksesi ja testaa niitä kuormitettuna varmistaakseen, että latenssi pysyy hyväksyttävissä rajoissa.
2. Käytä jaettu liiketoimet Sagas tai kaksivaiheinen toimitus
Kun liiketoimintaprosessi kattaa useita datavarastoja tai palveluja, tarvitset mekanismin atomisuuden ylläpitämiseksi. [Jakautuneet tapahtumat[[].].Tällainen on esimerkiksi kaksivaiheinen toimitusprotokolla (2PC) varmistaa, että jokainen osallistuva osapuoli joko tekee tai keskeyttää yhdessä. Kuitenkin 2PC voi olla hidas ja vähentää saatavuutta. Vaihtoehtona on [Sagakuvio, jossa jokainen toiminto lähettää jopa 25 toimenpidettä, jotka laukaisee kompensoivia toimia, jos jokin menee vikaan. Monet palvelimettomat alustat tarjoavat sisäänrakennettua tapahtumatukea: []DynamoDB-tapahtumia[] peittävät jopa 25 toimenpidettä useissa eri kohteissa, kun taas Cosmos DB tukee tapahtumaerätoimintoja.
3. Toteutetaan konfliktien ratkaisustrategioita
Samanaikaisesti kirjoitetaan samaan tietoerään monialuekäytössä voi luoda konflikteja. Palvelinvapaat kaupat tyypillisesti käyttävät viimeistysvoimia (LWW)[, joka pitää uusimman aikaleiman. Vaikka yksinkertainen, LWW voi menettää tietoja, jos kellot ovat pois synkronoitu. Käyttää [] versiovektoreja[ tai []CRDTs (Conflict-free Replicated DataTypes)[[]. DynamoDB. DynamoDB:n ehdolliset päivitykset ja versiokentät antavat sinun toteuttaa optimistisen lukituksen mukautetun konfliktinratkaisuun. Cosmos DB tarjoaa useita konfliktinratkaisukäytäntöjä, mukaan lukien mukautetun tallennetut menettelyt, jotka yhdistävät ristiriitaisia versioita.
4. Vipuvaikutus Idempotenttien operaatioiden ja retrovirusten
Verkkovirheet tai muuttuvat virheet voivat aiheuttaa asiakkaan uusintakäsittelyjä, jotka voivat johtaa kaksoiskäsittelyyn. Suunnittelun [-idempotentti [ poistaa tämän riskin. Esimerkiksi, määrittää ainutlaatuisen idemponency-avaimen jokaiseen kirjoituspyyntöön; palvelin voi sitten deduplicate pyyntöjä, jotka jakavat saman avaimen. Monet palvelimettomat SDK:t tukevat idempotentti kirjoittaa natiivisti. Yhdistä tämä eksponentiaaliseen backoffiin ja jitter uudelleen yrittäen logiikkaa vähentää kiistaa ja säilyttää johdonmukaisuutta ilman ylivoimainen taustaosa.
5. Seuraa tietojen eheyttä muutosvirtojen ja tarkastusten avulla
Palvelinkyvyttömässä ympäristössä voit käyttää [-muutosta tiedontallennukseen (CDC)[] ominaisuuksia, kuten DynamoDB-virtaa, Cosmos DB Change Feed, tai Firmostore-reaaliaikaisten kuuntelijoiden seurata kaikkia muutoksia. Aseta lambda- tai pilvitoiminto, jolla validoidaan, että datan vaihtelut pitävät sisällään jokaisen muutoksen jälkeen. Esimerkiksi pankkisovellus voi tilata tilitapahtumat ja tarkistaa, että saldo on aina sama kuin hyvitysten summa miinus veloitukset. Säännölliset audit-kyselyt voidaan havaita aikataulussa ja käynnistää korjaavat työvirrat.
6. Optimoi tietojen toistoa käyttötapaukseesi
Maailmanlaajuinen replikaatio parantaa käyttäjien latenssia ympäri maailmaa, mutta lisää epäjohdonmukaisuutta ikkunassa. Muokkaa toistoa sopivan johdonmukaisuuden tason kanssa ja harkitse []aktiivisen [:n käyttöä []aktiivisen passiivisen[[]:n] pahoittelun. Aktiivinen (multi-master) tarjoaa alemman kirjoituslatenssin, mutta vaatii lujaa konfliktinratkaisua. Aktiivinen-passiivi (yksi ensisijainen lukukopioilla) tarjoaa vahvemman johdonmukaisuuden kirjoittajille tarjotellessasi edelleen lähimpänä olevaa kopiota. Palvelut kuten Cosmos DB antavat mahdollisuuden valita viidestä tarkkaan määritetystä johdonmukaisuuden tasosta, vahvasta lopulta, vastaamaan replikointilaksien latenssitavoitteita.
Arkkitehtipiirrokset, jotka säilyttävät johdonmukaisuuden
Komentokyselyiden eriyttäminen (CQRS)
CQRS erottaa malleja lukumalleista, jolloin jokainen tila voidaan optimoida itsenäisesti. Kirjoitukset menevät vahvasti johdonmukaiseen varastoon; lukee lopulta yhdenmukaisista ennusteista. Tämä kuvio on erityisen tehokas, kun siihen yhdistetään tapahtuman hankinta[] lähestymistapa, jossa kaikki tilan muutokset tallennetaan muuttumattomiksi tapahtumiksi. Lukumallit voidaan rakentaa uudelleen tapahtumalokista, jos yhdenmukaisuutta ongelmia ilmenee. Martin Fowlers article on CQRS[ tarjoaa erinomaisen yleiskuvan.
Tapahtuman hankinta ja tapahtumakohtainen johdonmukaisuus
Tapahtuman hankinta tallentaa tapahtumasarjan nykyisen tilan sijaan. Koska tapahtumat ovat vain lisäosana ja muuttumattomia, ne ovat luonnollisesti johdonmukaisia. DynamoDB:n tai Cosmoksen kaltaiset palvelut voivat toimia tapahtumakauppoina. Kuluttajat käsittelevät tapahtumia synkronoidusti, lopulta rakentavat lukumalleja. Harvoissa tapauksissa konflikti, voit toistaa tapahtumavirran tunnetusta tarkistuspisteestä. Tämä malli takaa [] kestävyys ja auditability[ samalla tehdä siitä yksinkertaisen johdonmukaisuuden rajoista.
Ulkolaatikon kuvio luotettavalle viestille
Kun palvelimeton toiminto kirjoittaa tietokantaan ja lähettää viestin jonoon, nämä kaksi toimintoa eivät voi olla atomisia. []outbox-malli [ ratkaisee tämän tallentamalla viestin samaan tietokantaan samassa tapahtumassa. Erillinen prosessi (kuten stream-prosessori) lukee outboxin ja julkaisee viestin. Tämä takaa, että tietokannan kirjoittaminen ja viesti lähetetään joko sidotaan tai molemmat rullataan takaisin, säilyttäen johdonmukaisuus kaikissa palveluissa. SaaS-palveluntarjoajat kuten WS Hyvin arvioitu kuvaa ulkoasua[ yksityiskohtaisesti.
Erityistapausten käsittely: Geo-jakelu ja Offline-kirjoitukset
Mobiili- ja IoT-sovellukset toimivat usein offline-tilassa ja synkronoivat myöhemmin. Serverless-toimittaja SDK:t tarjoavat offline-jatkuvaa pysyvyyttä, joka käsittelee konflikteja mukautettujen konfliktien ratkaisulaitteiden avulla. Esimerkiksi AWS AppSync ja DynamoDB voivat yhdistää versioita aikaleiman tai asiakkaan määrittelemän logiikan perusteella. Käyttäessään tällaisia kirjastoja testaa aina konfliktinratkaisulogiikkaa todellisissa verkko-olosuhteissa ja seuraa konfliktien määrää.
Monialueisen johdonmukaisuuden osalta käytetään []-yhtälöryhmiä[, jos mahdollista.
Testaus- ja validointistrategiat
Johdonmukaisuusvirheet pintaan usein vain hajautettujen kuormien alla. Kirjoita integrointitestejä, jotka toimivat todellista palvelimetonta emulaattoria tai pilviesimerkkiä vastaan ja simuloivat samanaikaisia kirjoituksia ja lukemia. Työkalut kuten Jepsen[ voivat varmistaa, että datavarastosi toimii oikein verkkoosioiden alla. Tuotannossa, toteuta kanarian asennukset ja vähitellen siirtää liikennettä uusille koodipoluille samalla kun seuraat johdonmukaisuutmittareita. Määrittele SLAs-järjestelmä standenssille (suurin hyväksyttävä lukuaika) ja mittaa ne synteettisillä tapahtumilla.
Yhteenveto
Data johdonmukaisuus palvelimettomat datavarastot vaativat harkittuja arkkitehtonisia valintoja. Ymmärtämällä käytettävissä olevia johdonmukaisuusmalleja, käyttämällä hajautettuja tapahtumia tai tarinan kaavaa, suunnittelemalla idemopotenttisia toimintoja ja hyödyntämällä konfliktinratkaisumekanismeja, voit rakentaa sovelluksia, jotka ovat sekä skaalattavissa että luotettavia. Seurata järjestelmän johdonmukaisuutta takaa muutosvirtojen ja tarkastusten kautta, ja omaksua malleja kuten CQRS, tapahtumahankinta, ja ulkolaatikko malli säilyttää eheyden yli palvelun rajojen. Näiden parhaiden käytäntöjen, palvelimeton taustaosa antaa johdonmukaisen ja oikean kokemuksen sen käyttäjille .