Microservices Flashcards
Történeti áttekintés
Enterprise integration architektúra nagyvállalatoknál. Itt legacy kód van, nem szeretnek hozzányúlni, mert nehéz dolgozni vele. Ennek ellenére fontos adatok vannak ezekben. Ezekhez a nagy kódokhoz egy új csapat nehezen tud hozzáadni új appot, vagy egyáltalán fenntartani a meglévőt.
Monolitikus architektúra
Egy csapat agilis módszerrel fejleszt egy alkalmazást egy adatbázissal egészen addig, amíg nem kell még egy meg még egy csapat… Mivel egy adatbázis és egy alkalmazás van, ezért mindenkinek ugyanazt a nyelvet kell használnia. Aki utoljára csatlakozik, annak az összes technológiát ismernie kell. A telepítése release train-en keresztül megy, szinkronban kell mozogni: fejlesztők fejlesztenek, majd tesztelők tesztelnek, közben a fejlesztők az újat fejlesztik, majd végül - ha vége a tesztelési fázisnak - a rendszergazdák kiadják. Ez az architektúra nehezen skálázható és üzemeltethető. Minél nagyobb, annál nagyobb szerverek kellenek. Az alkalmazás nehezen reprodukálható. Előnye, hogy könnyű elkezdeni.
Monolitikus vs Microservices
A twitter, az eBay és az Amazon is monolitikusan indult, a nyomai még mindig megvannak ennek az architektúrának, azonban egy idő után problémák voltak a skálázhatósággal, komplexitással és agilitással, ezért lépniük kellett. Microservicekre tértek át, azonban ez egy hosszú folyamat volt. A Microservice-k követik a single responsibility elvet, adott műveletnek, osztálynak, komponensek egy oka kell, hogy legyen. Egy módosítás a rendszerben egy csapathoz kell tartozzon. Ha egy változtatáshoz túl sok mindent kell módosítani, akkor annak kicsi a fókusza. Egy deploymentben kell összpontosuljon egy service.
Microservice csapat, nagyság
Microserviceknél egy csapatnak akkorának kell lenni, hogy kb 2 pizzával jól lakjanak (3-12 ember), ez agilis módszertanhoz jól illeszkedő csapat méret. Egy csapat több Microservicért is felelhet. Egy Microservice nagysága akkora, hogy egy csapat 2 hét alatt újra kell tudja írja, akár más technológiával. A Microservicek hálózaton keresztül kommunikálnak egymással, így könnyen szétválaszthatóak lesznek.
Microservices skálázhatóság
Míg a monolitikus rendszerek csak vertikálisan tudnak skálázódni (ami meglehetősen korlátozott a hardver erőforrások miatt), addig a Microservicek képesek horizontálisan is skálázódni. A vertikálisnak fizikális kötöttségei vannak. A horizontális azt jelenti, hogy több gépen fut, azokon szétosztjuk a Microserviceket. Itt emiatt ritkán kell a vertikális skálázódás, de lehetséges. A clouddal a skálázhatóság automatizálhatóvá vált.
Microservices polyglotizmus
A Microserviceknél jelen van a polyglotizmus, ami a többnyelvűség: egy-egy Microservice íródhat különböző nyelveken, míg monolitikusnál ki kell választani egy nyelvet és ahhoz kell tartani magunkat végig. Ennek a lecserélése nagyon költséges folyamat. Microservice-nél csak a kommunikációs feltételeket kell betartani.
Microservices adattárolás
Microserviceknél alkalmazhatunk NoSQL-t, amivel sokkal szélesebb spektrumú adattárolás bevezetésére van lehetőség. Migrálás könnyebbé válik.
Microservices telepítés
A telepítés a monolitikus nézetnél egyre nehezebb és bonyolultabb a program növekedésével. Az egészet kell mindig, kis változtatás esetén is. Több csapat is változtatgat, ezért állandó kommunikáció kell köztük. Egyre nagyobb lesz a konfiguráció és az időigény. Egy idő után a történeti tudás lesz a fontos, ki van ott régóta, aki ismeri stb. Microservicenel a servicért felelős csapat önállóan meg kell tudnia oldani, mert csak egy service telepítődik. Kis változtatás hamar végbemegy. Amíg a kommunikáció nem sérül a többi service ezt nem észleli. Telepítés alatt nem szeretnénk, hogy a rendszer leálljon, ez a monolitikusnál sokkal nehezebb feladat.
Microservices kommunikáció
Kommunikációs szempontból monolitikusnál komponens vagy direkt hívások vannak, esetleg adatbázison keresztül, ritkán van távoli kommunikáció. Microservicenél a kommunikáció nagyobb fejtörést okoz, mert csak hálózaton keresztül kommunikálnak: ha az egyik átkerül másik infrastruktúrába, akkor is meg kell találniuk egymást. Amíg a kommunikáció nyelv független, addig a polyglotizmus nem sérül. Rest vagy http kommunikációval ez megoldható.
Ismert (Remote Procedure Call) keretrendszerek a gRPC, vagy az Apache THRIFT
● Hatékony, kompakt kommunikáció: GRPC és THRIFT bináris protokollokat használnak, amelyek hatékonyabbak a szöveges HTTP-nél, és kisebb méretű adatcsomagokkal teszik lehetővé a gyorsabb és hatékonyabb hálózati kommunikációt.
● Erősebb Típusosság: Mindkét keretrendszer erős típusosságot biztosít, amely lehetővé teszi a fejlesztők számára a szigorúbb ellenőrzést és könnyebb hibakeresést.
Monolitikus vs microservices teljesítmény különbség
Vannak teljesítmény különbségek a kommunikációs módszereknél. Bizonyos réteg alatt használhatunk más protokollt. Async kommunikáció esetén mindig van egy üzenet továbbító közeg (pl. Kafka(topic alapú), vagy RabbitMQ(queue alapú)).
● Hibatűrésben is van különbség a két technológia között.
○ Monolitikusnál könnyen átgyűrűzik a hiba más komponensekbe.
○ Microserviceknél ha egy rendszer leáll, csak a közvetlen környezete észleli. Ha építünk be hibatűrési algoritmust, akkor a közvetlen környezet is védve lesz. Ez egy biztosíték, így nem gyűrűzik tovább a hiba.
A Microservice hátrányai: infrastruktúra béli komplexitás, futtatási környezet sokkal összetettebb, több technológia, könnyű ebben elveszni. Fontos, hogy vannak központi servicek: log, metrikák stb. Minden csapatnak hozzá kell ezekhez férni. Ezeknek gyorsnak kell lenniük. Nagyobb hálózati teljesítmény kell a hálózati kommunikáció miatt. Nem könnyű ezeket a rendszereket fejleszteni.
Microservices deisgn patterns
- Kommunikáció
- Közös adatbázis (anti pattern)
- Szinkron kommunikáció
- Aszinkron kommunikáció
- Függőségek kezelése
- Shared library (anti pattern)
- Technical boundary (anti pattern)
- Integrációs portok pattern
Kommunikáció
(Microservices deisgn patterns)
API az egyik alappillére, megfelelő tulajdonságokkal kell rendelkeznie, hogy egyszerű legyen, könnyen használható legyen, a ráépülő fejlesztés gördülékeny legyen, kevés hibával. API követelmények: kompatibilitás régebbi verziókkal, technológia függetlenség, implementáció teljes elrejtése a kliens felől (pl adatbázis lecserélése ne hasson ki rá, egyszerűség).
Közös adatbázis (anti pattern)
(Microservices deisgn patterns)
Általában monolitikus átmigrálásnál szokott lenni. Nem jó, mert nem kompatibilis visszafelé, ehhez régi verziókhoz régi adatbázisok kellenek. Ha valamit adott adatbázisban módosítani akarunk, azt mindenkinek tudnia kell. Nem lesz ettől nyelv független sem. Minden servicenek ezt kell használnia. Nem követhető, mert nem tudjuk melyik táblát melyik service módosította. Sokszor inkonzisztenciát okoz.
Szinkron kommunikáció
(Microservices deisgn patterns)
Két service között szinkron metódus hívás (pl rest). Ezeknek a protokolloknak jól definiált interface van a technológiailag függetlennek mondható http miatt, így gyorsan fejleszthető egy vékony kliens. Hátránya, hogy több helyen problémája lehet a szinkron kommunikációval. Nehézkes a hibakezelés, ha a küldő félnél hiba van, ilyenkor timeout implementálás kell: kompenzálni kell a hívó felé, ha a hívott félnél van a hiba, nem tud különbséget tenni. Itt van lehetőség a visszafelé kompatibilitásra, ilyenkor a migráció nehézkés. Ha mindenki átáll az újra, akkor a régit megszüntetjük.
Aszinkron kommunikáció
(Microservices deisgn patterns)
Üzenetküldő közeg, bizonyos garanciával vannak továbbítva az üzenetek. A sorrendiség garantált. Mindig van egy 3. fél, aki az üzenetek továbbításáért, tárolásáért, konzisztensen tartásáért felel. Ha a hívott fél nem elérhető, akkor az üzenetek tárolva maradnak. Amint csatlakozik továbbítva lesz felé. Rugalmas, hibatűrő kommunikációs mód. Visszafelé kompatibilitás lehetséges üzenetenként és csatornánként is. Nem érdemes sokáig fenntartani a visszafele kompatibilitást.