Suvremeni distribuirani sustavi sve su o kompromisima. Performanse, pouzdanost, skalabilnost i dosljednost ne dolaze besplatno — uvijek negdje plaćate cijenu. Tu dolazi CAP teorem: to je početna točka za razumijevanje neizbježnih kompromisa u distribuiranom dizajnu.
Zašto je CAP teorem točan? Što zapravo objašnjava? I, što je najvažnije, je li dovoljno? U ovom ćemo postu istražiti CAP teorem, njegova ograničenja, kritike s kojima se suočava i kako novije ideje poput PACELC-a guraju razgovor naprijed. Zaronimo.
Prva verzija CAP teorema započela je kao rasprava između KISELINE i BAZE . Ali s vremenom se razvio, dobio formalni dokaz i diplomirao da postane CAP teorem kakvog danas poznajemo.
CAP teorem kaže da distribuirani sustav može zadovoljiti najviše dva od tri svojstva istovremeno :
Ovo ograničenje tjera inženjere na teške kompromise ovisno o ciljevima sustava i stvarnosti njihovih distribuiranih okruženja.
Dosljednost u CAP-u nije isto što i dosljednost u ACID transakcijama . U CAP teoremu to se odnosi na linearizabilnost ili jaku konzistentnost . To znači da svi čvorovi u distribuiranom sustavu moraju uvijek predstavljati jedan, ažuran pogled na podatke , bez obzira na to koji čvor obrađuje zahtjev. To znači da svaka operacija čitanja odražava najnovije pisanje, bez obzira koji čvor postavljate upit.
💡 Dosljednost u ACID-u, s druge strane, fokusira se na osiguravanje da transakcija dovodi bazu podataka iz jednog važećeg stanja u drugo važeće stanje, slijedeći pravila definirana shemom baze podataka. Više se radi o nametanju ograničenja integriteta (kao što su strani ključevi, jedinstvena ograničenja itd.) i osiguravanju da baza podataka ne ostane u nevažećem stanju, čak i u slučaju padova.
Dostupnost u CAP-u znači da svaki čvor koji ne kvari mora vratiti odgovor za svaki zahtjev koji primi, bez obzira na particije mreže . Drugim riječima, ako zdravi čvor dobije zahtjev, mora ga obraditi i odgovoriti na njega. Međutim, CAP ne jamči da će odgovor uvijek biti "točan" ili ažuran — on samo osigurava da čvor ne otkaže tiho (na primjer, čvorovi u AP sustavu mogu odgovoriti ustajalim podacima tijekom particije kako bi se osigurala dostupnost ).
💡 Eric Brewer (izvorni autor CAP-a) izvorno je opisao ovo svojstvo malo fleksibilnije kao: "gotovo svi upiti trebaju dobiti odgovor". Međutim, u formalnom dokazu CAP-a, dostupnost je postrožena, zahtijevajući da "svaki upit dobije odgovor sve dok je čvor koji njime rukuje ispravan".
U praksi, međutim, dostupnost nije apsolutno jamstvo — često ovisi o ograničenjima specifičnim za sustav, poput toga koliko dugo ste spremni čekati na odgovor. Za sustave u stvarnom svijetu, vrijeme odziva (ili isteci vremena) igra ključnu ulogu u oblikovanju vašeg SLA (ugovora o razini usluge), iako sam CAP izravno ne uzima u obzir kašnjenje. Više o tome u ovom postu na blogu .
Tolerancija particije je sve o preživljavanju mrežnih kvarova. Ako čvorovi ne mogu komunicirati zbog mrežne podjele (particije), sustav i dalje mora ispunjavati svoja jamstva dosljednosti ili dostupnosti, ovisno o izboru dizajna. Particija se događa kada čvorovi ne mogu komunicirati zbog ispuštenih paketa, isteka vremena ili mrežnih podjela.
Distribuirani sustavi ne žive u svijetu bajke sa savršenim mrežama. Paketi se ispuštaju, događaju se vremenski prekidi i skokovi kašnjenja su neizbježni. Zbog toga se o toleranciji particije ne može raspravljati u bilo kojem distribuiranom sustavu — particije će se dogoditi prije ili kasnije, tako da ne možete "odabrati" ignorirati to, koliko god primamljivo zvučalo.
U CAP-u, tolerancija particije ne znači da sustav nastavlja raditi kao da se ništa nije dogodilo. To znači da sustav mora odlučiti hoće li dati prioritet dostupnosti (AP) ili dosljednosti (CP) tijekom particije. Ako biste zanemarili toleranciju particije, u biti biste gradili nedistribuirani monolitni sustav.
Najlakši način za razumijevanje CAP-a je razmatranje mrežne particije — situacije u kojoj dva dijela distribuiranog sustava ne mogu međusobno komunicirati. U takvom scenariju sustav se suočava s tri moguća ishoda:
Stoga, tijekom particije , sustav može zadovoljiti samo dva od tri svojstva (C, A ili P) . Nakon što je particija razriješena (tj. čvorovi ponovno komuniciraju), sustav može povratiti sva tri svojstva, ali tijekom same particije kompromisi su neizbježni.
Posljedica teorema za asinkrone sustave je da su moguće samo tri kombinacije dosljednosti, dostupnosti i tolerancije particije:
Sustavi ove vrste odgovaraju na upite, ali vraćeni podaci možda neće uvijek biti ažurni, sa sporijim ažuriranjem podataka, ali "uvijek" dostupnim. Primjeri takvog sustava su DNS, DynamoDB i Cassandra.
Sustavi ove vrste uvijek vraćaju ažurne podatke, ali neki ili čak svi čvorovi u sustavu možda neće odgovoriti ako su particionirani. Daje atomska ažuriranja, ali može dovesti do vremenskog ograničenja. NoSQL baze podataka kao što su Google BigTable, MongoDB, HBase i Redis svi su sustavi ove vrste.
Sustavi ove vrste uvijek vraćaju ažurne podatke kada nema particija. Zbog posljednjeg ograničenja, obično se takvi sustavi koriste samo unutar jednog stroja. Primjeri su klasične relacijske baze podataka.
U stvarnosti biramo između CP i AP jer je CA u osnovi monolit bez particija. Za sustave velikih razmjera dizajneri ne mogu napustiti P i stoga imaju težak izbor između C i A.
U CA-u kvar čvora znači potpunu nedostupnost usluge. Ali to ne onemogućuje skalabilnost, budući da možemo klonirati neovisne monolite i rasporediti opterećenje preko njih
CAP teorem je bio temeljni koncept u distribuiranim sustavima, ali nije bez svojih ograničenja. Uza svu svoju jasnoću u predstavljanju ideje kompromisa, CAP teorem često je kritiziran zbog pretjeranog pojednostavljivanja složenih stvarnosti, što je dovelo do nesporazuma i pogrešne primjene.
Jedna od najčešćih kritika je da se kompromisi teorema CAP-a — odabir između dosljednosti (C) i dostupnosti (A) — primjenjuju samo kada mrežna particija (P) stvarno postoji. U normalnom radu, kada je mreža stabilna i ne postoje particije, nema inherentnog kompromisa između dosljednosti i dostupnosti.
Nadalje, ti kompromisi nisu univerzalni za cijeli sustav. Unutar istog distribuiranog sustava:
Ova se nijansa često gubi u raspravama na visokoj razini o CAP-u, što dovodi do pretjerano pojednostavljenih klasifikacija sustava kao "CP" ili "AP" u cijelosti.
Druga važna kritika je da CAP teorem ne uzima u obzir latenciju , iako su latencija i particioniranje duboko povezani u praksi. Na primjer:
U distribuiranim sustavima u stvarnom svijetu, kada se dogodi particija ili velika latencija, sustav mora donijeti odluku unutar vremenskog razdoblja : dati prioritet dostupnosti vraćanjem moguće zastarjelog rezultata ili dati prioritet dosljednosti tako što će čekati duže (i potencijalno ne odgovoriti). CAP-ov binarni prikaz ne obuhvaća složenost ovih odluka.
CAP teorem predstavlja dosljednost, dostupnost i toleranciju particije kao binarna svojstva - ili ih imate ili nemate. Ali u praksi, sva tri svojstva postoje u spektru :
Ova kontinuirana priroda svojstava čini CAP previše pojednostavljenim za modeliranje složenosti modernih distribuiranih sustava.
Iako je CAP revolucionirao naše razumijevanje kompromisa u distribuiranim sustavima, to nije posljednja riječ o toj temi. PACELC teorem koji je opisao Daniel J. Abadi smatra se alternativnim pristupom dizajnu distribuiranih sustava. Temelji se na CAP modelu, ali uz dosljednost, dostupnost i toleranciju particije također uključuje kašnjenje i logičko isključivanje između kombinacija ovih koncepata.
PACELC uvodi dva različita načina rada za distribuirane sustave:
Iako su particije neizbježne u distribuiranim sustavima, one su rijetke u usporedbi s izazovima koji se javljaju tijekom normalnog rada. U modernim distribuiranim sustavima kašnjenje je često veće usko grlo od mrežnih particija, posebno za aplikacije na globalnoj razini. Ovo je mjesto na koje se PACELC fokusira — rješavanjem kompromisa koji se javljaju kada sustav radi bez particija. Za razliku od CAP-a, koji se fokusira isključivo na ponašanje tijekom scenarija kvara, PACELC naglašava odluke koje arhitekti moraju donositi svaki dan kako bi uravnotežili kašnjenje (L) i dosljednost (C) :
Proširujući razgovor izvan particija kako bi uključio normalan rad, PACELC osigurava da se svakodnevna izvedba distribuiranih sustava tretira s važnošću koju zaslužuje.
Formulacija CAP teorema je značajan događaj u zajednici, a studije o njegovom utjecaju na dizajn distribuiranih sustava pokazale su da projektanti distribuiranih sustava ne bi trebali ograničiti sustav na dva svojstva - oni bi trebali nastojati maksimizirati jamstva potrebna u svakom poseban slučaj. U tu svrhu razumno je sustav podijeliti na segmente od kojih svaki ima svoje zahtjeve te projektirati sustav na temelju zahtjeva svakog od segmenata.
CAP teorem bio je kamen temeljac razmišljanja o distribuiranim sustavima desetljećima. Dao nam je okvir za razmišljanje o inherentnim kompromisima dosljednosti, dostupnosti i tolerancije particije. Ali na mnogo načina, to je pojednostavljenje stvarnosti, pretpostavljajući binarni izbor i ignorirajući kritične čimbenike poput latencije.
PACELC se oslanja na CAP, priznajući da:
I CAP i PACELC su vrijedni alati, ali ni jedan nije korak po korak recept za izgradnju sustava. Umjesto toga, oni pružaju mentalne modele za procjenu kompromisa i razumijevanje ograničenja distribuiranih arhitektura.
Hvala vam na čitanju!
Zanima vas nešto ili želite podijeliti svoje mišljenje? Ostavite svoj komentar ispod! Provjerite moj blog ili me pratite putem LinkedIna , Substacka ili Telegrama .