# 6. Distribuované systémy
Základní pojmy, principy. Rozdíl mezi centralizovanou a distribuovanou architekturou systému, nevýhody obojího a jejich překonávání. Replikace, sdílení dat. Architektura orientovaná na služby (SOA), webové služby. Příklady existujících technologií a jejich využití. Příklady z praxe pro vše výše uvedené. (PA053)
---
## Základné pojmy, princípy
**Distribuovaný systém** sa skladá z komponentov (počítačov) prepojených komunikačnou sieťou. Distribuované systémy riešia problémy (výpočty, odpovede na dotazy) spoluprácou jednotlivých komponentov. Vďaka tomu dokáže systém horizontálne škálovať.
Charakteristické **vlastnosti** distribuovaných systémov:
- Concurrency - spracováva v jeden čas mnoho požiadaviek
- Lack of global clock - udalosti sa nedajú zoradiť podľa času spracovania
- Independent failures - spadnutie uzlu by nemalo spôsobiť pád celého systému
- Synchronization - spracovávanie požiadaviek a výsledkov musí podliehať pravidlám
**Middleware** je vrstva softvéru poskytujúca rozhranie pre interakciu s rôznymi službami alebo systémami. Môže sa jednať o abstrakcie k často používanej funkcionalite, či o vrstvu, ktorá prepája už existujúce systémy.
- Napríklad ASP.NET je framework, ktorý obsahuje middleware na autorizáciu a autentizáciu
**RPC** (Remote Procedure Call) je technika volania funkcií na vzdialenom uzle. Jedná sa o formu API s pripojením do siete.
Príklady typov middlewarov:
- RPC - gRPC, SOAP
- Message-oriented - RabbitMQ, MPI (Message Passing Interface), REST, MQTT
- Object request broker - CORBA
- Database - JDBC
**Architektúrou** rozumieme organizačnú štruktúru aplikačného systému. Jedná sa o vysokoúrovňovú abstrakciu jednotlivých **komponentov** a **vzťahov** medzi nimi. Veľkou súčasťou architektúry sú **návrhové vzory**.
## Rozdiel medzi centralizovanou a distribuovanou architektúrou systému, nevýhody obidvoch a ich prekonávanie, architektúra orientovaná na služby (SOA)
**Centralizovaná** architektúra zhromažďuje biznisovú logiku a dáta na jednom mieste.
- Jedná sa o **monolitickú architektúru**, zvyčajne o samostatne bežiacu desktop aplikáciu
- Nedokáže horizontálne škálovať, iba vertikálne
- Nedokáže sa replikovať, nemá redundanciu
- Nízka flexibilita, veľký dôraz na kvalitu kódu
- Výhodou je jednoduchosť nasadzovania a rozmýšlania, sústredime sa iba na logiku aplikácie
**Distribuovaná architektúra** spočíva v rozdelení biznisovej logiky a dát na viacero miest.
Často sa jedná o **viacvrstvovú architektúru** typu klient-server:
- **Jednovrstvová** architektúra - thin client, server
- Všetko je uložené na serveri, aj prezentačná vrstva
- Klient je ľahký, slúži iba na pripojenie k serveru (terminál)
- Problém - Single point of failure
- **Dvojvrstvová** architektúra - thick client, server
- Prezentačná vrstva je oddelená od serveru, niektoré výpočty sa môžu presunúť na klienta
- Výhoda: lacnejší server
- Nevýhoda: tight coupling
- **N-vrstvová** architektúra - thin/thick client, layered server services
- Biznis logika sa môže rozvrstvovať v rámci servera
- Výhoda: lepšia škálovatelnosť a spolahlivosť, kvalita kódu
- Nevýhoda: vyššia cena, zložitejší prístup
**Komponentová architektúra** (component-based architecture) definuje systém na jednotlivé komponenty, z ktorých je zložený. **Komponenty** kladú dôraz na znovu-použiteľnosť, jednoduchosť použitia a ľahkosť výmeny.
- Príklad: Windows COM (Component Object Model), React Web Components
- Výhoda: systém, ktorý používa komponenty potrebuje vedieť iba ich interface, nie implementáciu
**Architektúra orientovaná na služby** (SOA, service-oriented architecture) rozďeluje systém na jednotlivé služby, ktoré majú poskytovať zlomkovú funkcionalitu celého systému. Typicky máme nástroj - zbernicu (**enterprise bus**) alebo **API Gateway**, pomocou ktorého vedia služby komunikovať medzi sebou. Prezentačná vrstva sa typicky napája priamo skrz túto zbernicu pomocou API.
- Výhody: loose coupling, fully distributed, easy to maintain, service discovery, redundancy, reusability, statelessness
- Nevýhody: zmeny v interface-och služieb môžu spôsobiť nekompatibilitu
**Microservices architektúra** je subtypom SOA, ktorá sa sústredí na vytvorenie čo najviac, čo najmenších služieb. Dôležitý princíp je **vysoká kohéznosť** v prípade ak máme microservicy, ktoré sú závislé na iných službách, jedná sa o **distribuovaný monolit**, čo je klasický antipattern.
- Mikroslužby majú typicky samostatnú databázu, robia iba jednu konkrétnu funkciu
- V prípade že mikroslužba spadne, ovplyvní to len malú časť aplikácie, ktorá sa dokáže zakryť
- Výhody: škálovatelnosť
- Nevýhody: cena, náročnosť implementácie a udržiavanie
**Peer-to-peer architektúra** sa používa v prípade, ak máme klientov, ktorí komunikujú medzi sebou bez servera. Zvyčajným účelom je zdieľanie dát, replikácia, zdieľanie služieb.
- Príklad: BitTorrent, Napster, cryptocurrency networks
- Výhody: fault-tolerant, vysoko škáloveteľné
- Nevýhody: náročné vyhľadávanie služieb, uzlov, smerovanie, konzistencia siete
**Shared Nothing architektúra** spočíva v použití "shardov", čo sú samostatne stojace uzly, nezávislé na iných. Využíva sa na rozdelenie dát a replikáciu.
## Webové služby
**Webovou službou** rozumieme aplikáciu, ktorá je dostupná pomocou nejakého API na úrovni aplikačných protokolov HTTP. Využívame protokoly a techniky:
- SOAP (Simple Object Access Protocol)
- Používa XML na definíciu správ, je to druh RPC
- WSDL (Web Service Definition Language)
- Používa XML na definíciu SOAP služieb
- REST (Representational State Transfer)
- Architektonický vzor webových služieb na základe HTTP protokolu
- Iba správy GET, POST, UPDATE, DELETE
- Zakázaný stav medzi správami - stateless, princíp idempotencie
- Zvyčajne používa správy typu JSON
- GraphQL
- Moderný protokol na získavanie údajov skrz webovú službu
- Ľahké filtrovanie, niečo ako remote RDBMS
- Slúži iba na dotazovanie
## Replikácia, zdieľanie dát
Typickým problémom distribuovaných systémov je **CAP theorem**. Distribuovaný systém vie mať iba 2 vlastnosti v jeden moment:
- **Consistency** - uzol vždy odpovie správne alebo vôbec
- **Availability** - uzol, ktorý nie je v chybovom stave vždy odpovie
- **Partition tolerance** - systém funguje správne aj napriek tomu, že sa správy nedostanú k uzlu
Príklad: ak máme cluster, ktorému prestanú chodiť dáta, tak odpovieme s chybou a nič neurobí (CP) alebo sa zmena vykoná, a rozdelený systém sa dostane do nekonzistentného stavu (AP).
**Relačné databázové systémy (CA)** ako MySQL, MSSQL, Postgres vedia pracovať v clusteroch, aby bola vždy zabezpečená dvojica vlastností CAP. Dochádza k **replikácii** dát (master-slave) alebo k shardingu.
- Master-slave - dáta sa iba kopírujú z mastra do slave, periodicky alebo po zmene
- Sharding - každý databázový uzol vlastní časť dát a pristupuje sa k nim skrz proxy
V prípade, ak sa vzdáme vlastností **ACID**, môžeme dosiahnuť určitú úroveň vlastností CAP. NoSQL databázy sa často riadia princípom **BASE**:
- Basically available - čítanie a zápis sú dostupné poďla možností, ale nezaručujú konzistenciu dát
- Soft-state - bez garancie konzistencie, po určitom čase existuje nejaká pravdepodobnosť nekonzistencie
- Eventually consistent - po určitej dobe môžeme tvrdiť, že systém sa dostane do konzistentného stavu
Príklad: MongoDB NoSQL (CP) databáza, typicky používaná na OLAP (analytické spracovanie), Big Data (Apache Hadoop, Spark), stream processing, batch processing