{"id":80035,"date":"2020-05-02T13:42:54","date_gmt":"2020-05-02T11:42:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny"},"modified":"2020-05-02T13:42:54","modified_gmt":"2020-05-02T11:42:54","slug":"udobnye-arhitekturnye-patterny","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","title":{"rendered":"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hell\u00f3, Habr!<\/p>\n<p><\/p>\n<p>A koronav\u00edrus miatt kialakult helyzet f\u00e9ny\u00e9ben sz\u00e1mos internetes szolg\u00e1ltat\u00e1s megn\u00f6vekedett terhel\u00e9st tapasztal. P\u00e9ld\u00e1ul, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.independent.co.uk\/life-style\/gadgets-and-tech\/news\/coronavirus-ocado-down-app-website-stockpiling-food-online-delivery-a9402216.html\">az Egyes\u00fclt Kir\u00e1lys\u00e1g egyik kiskereskedelmi l\u00e1nca egyszer\u0171en le\u00e1ll\u00edtotta az online rendel\u00e9seket a weboldal\u00e1n,<\/a><\/noindex>mivel nem \u00e1lltak rendelkez\u00e9sre elegend\u0151 er\u0151forr\u00e1sok. Nem mindig lehet csak er\u0151sebb hardver hozz\u00e1ad\u00e1s\u00e1val felgyors\u00edtani a szervert, azonban a v\u00e1s\u00e1rl\u00f3i ig\u00e9nyeket kezelni kell (k\u00fcl\u00f6nben elmennek a versenyt\u00e1rsakhoz).<\/p>\n<p><\/p>\n<p>Ebben a cikkben r\u00f6viden bemutatom a n\u00e9pszer\u0171 gyakorlatokat, amelyek lehet\u0151v\u00e9 teszik a gyors \u00e9s megb\u00edzhat\u00f3 szolg\u00e1ltat\u00e1s kialak\u00edt\u00e1s\u00e1t. Az \u00e1ltalam kiv\u00e1lasztott fejleszt\u00e9si s\u00e9m\u00e1k k\u00f6z\u00fcl csak azokat emelem ki, amelyek jelenleg <strong>k\u00f6nnyen el\u00e9rhet\u0151k.<\/strong>Minden egyes ponthoz vagy m\u00e1r l\u00e9teznek k\u00f6nyvt\u00e1rak, vagy lehet\u0151s\u00e9g van a probl\u00e9ma megold\u00e1s\u00e1ra felh\u0151alap\u00fa platformon.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"gorizontalnoe-masshtabirovanie\">Horizont\u00e1lis sk\u00e1l\u00e1z\u00e1s<\/h1>\n<p><\/p>\n<p>A legsimplebb \u00e9s legjobban ismert pont. \u00c1ltal\u00e1noss\u00e1gban a leggyakrabban el\u0151fordul\u00f3 terhel\u00e9seloszt\u00e1si s\u00e9m\u00e1k a horizont\u00e1lis \u00e9s a vertik\u00e1lis sk\u00e1l\u00e1z\u00e1s. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C#%D0%93%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">Az els\u0151 esetben<\/a><\/noindex> lehet\u0151v\u00e9 teszi a szolg\u00e1ltat\u00e1sok p\u00e1rhuzamos m\u0171k\u00f6d\u00e9s\u00e9t, ez\u00e1ltal elosztva a terhel\u00e9st k\u00f6z\u00f6tt\u00fck. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C#%D0%92%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">A m\u00e1sodik esetben<\/a><\/noindex> er\u0151sebb szervereket rendel, vagy optimaliz\u00e1lja a k\u00f3dot.<\/p>\n<p><\/p>\n<p>P\u00e9ld\u00e1nak ok\u00e1\u00e9rt egy absztrakt felh\u0151t\u00e1rol\u00f3 rendszer, amely hasonl\u00f3 az OwnCloudhoz, OneDrivehoz \u00e9s \u00edgy tov\u00e1bb.<\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151 \u00e1bra egy tipikus s\u00e9m\u00e1t mutat be, azonban ez csak a rendszer \u00f6sszetetts\u00e9g\u00e9t demonstr\u00e1lja. Valahogy szinkroniz\u00e1lnunk kell a szolg\u00e1ltat\u00e1sokat. Mi t\u00f6rt\u00e9nik, ha a felhaszn\u00e1l\u00f3 egy t\u00e1blag\u00e9pr\u0151l mentette a f\u00e1jlt, majd telefonon szeretn\u00e9 megn\u00e9zni?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/7512c6d8783f5e0a38cc0861b01e54c8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA megk\u00f6zel\u00edt\u00e9sek k\u00f6z\u00f6tti k\u00fcl\u00f6nbs\u00e9g: vertik\u00e1lis sk\u00e1l\u00e1z\u00e1s eset\u00e9n a csom\u00f3pontok teljes\u00edtm\u00e9ny\u00e9t n\u00f6velj\u00fck, m\u00edg horizont\u00e1lis sk\u00e1l\u00e1z\u00e1s eset\u00e9n \u00faj csom\u00f3pontokat adunk hozz\u00e1 a terhel\u00e9s eloszt\u00e1s\u00e1hoz.<\/p>\n<p><\/p>\n<h1 id=\"cqrs\">CQRS<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/CQRS.html\">Command Query Responsibility Segregation<\/a><\/noindex> meglehet\u0151sen fontos minta, mivel lehet\u0151v\u00e9 teszi a k\u00fcl\u00f6nb\u00f6z\u0151 \u00fcgyfelek sz\u00e1m\u00e1ra, hogy ne csak k\u00fcl\u00f6nb\u00f6z\u0151 szolg\u00e1ltat\u00e1sokhoz csatlakozzanak, hanem egyenl\u0151 esem\u00e9nyfolyamokat is kapjanak. El\u0151nyei nem annyira nyilv\u00e1nval\u00f3ak egy egyszer\u0171 alkalmaz\u00e1s eset\u00e9n, azonban rendk\u00edv\u00fcl fontos (\u00e9s egyszer\u0171) egy nagy terhel\u00e9s\u0171 szolg\u00e1ltat\u00e1s sz\u00e1m\u00e1ra. L\u00e9nyege: a bej\u00f6v\u0151 \u00e9s a kimen\u0151 adatfolyamok nem metszhetik egym\u00e1st. Azaz nem k\u00fcldhet k\u00e9rd\u00e9st, \u00e9s ne v\u00e1rjon v\u00e1laszt; ehelyett k\u00e9rd\u00e9st k\u00fcld a A szolg\u00e1ltat\u00e1sba, viszont v\u00e1laszt kap B szolg\u00e1ltat\u00e1sb\u00f3l.<\/p>\n<p><\/p>\n<p>Ennek a megk\u00f6zel\u00edt\u00e9snek az els\u0151 el\u0151nye, hogy lehet\u0151s\u00e9g van a kapcsolat megszak\u00edt\u00e1s\u00e1ra (ebben a szavak t\u00e1g \u00e9rtelm\u00e9ben) egy hossz\u00fa k\u00e9r\u00e9s teljes\u00edt\u00e9se sor\u00e1n. Vegy\u00fcnk egy nagyj\u00e1b\u00f3l szabv\u00e1nyos folyamatot p\u00e9ld\u00e1nak:<\/p>\n<p><\/p>\n<ol>\n<li>A kliens k\u00e9rd\u00e9st k\u00fcld\u00f6tt a szervernek.<\/li>\n<li>A szerver elind\u00edtott egy hossz\u00fa feldolgoz\u00e1st.<\/li>\n<li>A szerver v\u00e1laszolt a kliensnek az eredm\u00e9nnyel.<\/li>\n<\/ol>\n<p><\/p>\n<p>Tegy\u00fck fel, hogy a 2. pontban kapcsolat megszakad (vagy a h\u00e1l\u00f3zat \u00fajrakapcsol\u00f3dik, vagy a felhaszn\u00e1l\u00f3 \u00e1tmegy egy m\u00e1sik oldalra, megszak\u00edtva a kapcsolatot). Ebben az esetben a szerver nehezen tud v\u00e1laszolni a felhaszn\u00e1l\u00f3nak arr\u00f3l, hogy pontosan mi lett feldolgozva. A CQRS alkalmaz\u00e1s\u00e1val a folyamat kiss\u00e9 m\u00e1sk\u00e9pp alakul:<\/p>\n<p><\/p>\n<ol>\n<li>A kliens feliratkozott a friss\u00edt\u00e9sekre.<\/li>\n<li>A kliens k\u00e9rd\u00e9st k\u00fcld\u00f6tt a szervernek.<\/li>\n<li>A szerver v\u00e1laszolt, hogy \"k\u00e9r\u00e9s elfogadva\".<\/li>\n<li>A szerver v\u00e1laszolt az eredm\u00e9nnyel az \"1\" pontb\u00f3l sz\u00e1rmaz\u00f3 csatorn\u00e1n.<\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/8a00ea93eecc7cc0754122857c5f90d0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mint l\u00e1that\u00f3, a rendszer kiss\u00e9 bonyolultabb. R\u00e1ad\u00e1sul itt hi\u00e1nyzik az intuit\u00edv k\u00e9r\u00e9s-v\u00e1lasz megk\u00f6zel\u00edt\u00e9s. Azonban, amint l\u00e1tszik, a kapcsolat megszakad\u00e1sa a k\u00e9r\u00e9s feldolgoz\u00e1sa k\u00f6zben nem vezet hib\u00e1hoz. R\u00e1ad\u00e1sul, ha a felhaszn\u00e1l\u00f3 val\u00f3j\u00e1ban t\u00f6bb eszk\u00f6zh\u00f6z csatlakozik (p\u00e9ld\u00e1ul mobiltelefonhoz \u00e9s t\u00e1blag\u00e9phez), a v\u00e1laszok mindk\u00e9t eszk\u00f6zre \u00e9rkezhetnek.<\/p>\n<p><\/p>\n<p>\u00c9rdekess\u00e9g, hogy a bej\u00f6v\u0151 \u00fczenetek feldolgoz\u00e1s\u00e1nak k\u00f3dja egyform\u00e1n (nem 100%-ban) m\u0171k\u00f6dik mind a kliens \u00e1ltal kezdem\u00e9nyezett esem\u00e9nyek, mind a t\u00f6bbi esem\u00e9ny, k\u00f6zt\u00fck m\u00e1s kliens \u00e1ltal \u00e9rkezett esem\u00e9nyek eset\u00e9n.<\/p>\n<p><\/p>\n<p>Val\u00f3j\u00e1ban azonban tov\u00e1bbi el\u0151ny\u00f6ket kapunk abb\u00f3l, hogy az egyir\u00e1ny\u00fa \u00e1raml\u00e1st funkcion\u00e1lis st\u00edlusban lehet feldolgozni (RX \u00e9s hasonl\u00f3k haszn\u00e1lat\u00e1val). Ez m\u00e1r komoly el\u0151ny, mivel l\u00e9nyeg\u00e9ben az alkalmaz\u00e1s teljesen reakt\u00edvv\u00e1 tehet\u0151, funkcion\u00e1lis megk\u00f6zel\u00edt\u00e9s alkalmaz\u00e1s\u00e1val. Nagyobb programok eset\u00e9n ez jelent\u0151sen cs\u00f6kkentheti a fejleszt\u00e9si \u00e9s karbantart\u00e1si k\u00f6lts\u00e9geket.<\/p>\n<p><\/p>\n<p>Ha ezt a megk\u00f6zel\u00edt\u00e9st v\u00edzszintes sk\u00e1l\u00e1z\u00e1ssal kombin\u00e1ljuk, akkor az el\u0151ny, hogy egy szerverre k\u00fcldhet\u00fcnk k\u00e9r\u00e9seket, m\u00edg v\u00e1laszokat m\u00e1sr\u00f3l kaphatunk. \u00cdgy a kliens maga v\u00e1laszthatja ki a sz\u00e1m\u00e1ra k\u00e9nyelmes szolg\u00e1ltat\u00e1st, a rendszer pedig bels\u0151leg m\u00e9g mindig helyesen tudja feldolgozni az esem\u00e9nyeket.<\/p>\n<p><\/p>\n<h1 id=\"event-sourcing\">Esem\u00e9nyforr\u00e1s<\/h1>\n<p><\/p>\n<p>Ahogy tudj\u00e1tok, a decentraliz\u00e1lt rendszerek egyik f\u0151 jellemz\u0151je a k\u00f6z\u00f6s id\u0151 \u00e9s a k\u00f6z\u00f6s kritikus szakasz hi\u00e1nya. Egy folyamat eset\u00e9n szinkroniz\u00e1lhatjuk (ugyanazokon a mutexeken), ahol biztosak vagyunk benne, hogy senki m\u00e1s nem futtatja ezt a k\u00f3dot. Azonban egy decentraliz\u00e1lt rendszerben ez vesz\u00e9lyes, mivel f\u00f6l\u00f6sleges er\u0151forr\u00e1sokat ig\u00e9nyel, \u00e9s meg\u00f6li a sk\u00e1l\u00e1zhat\u00f3s\u00e1g var\u00e1zs\u00e1t \u2013 v\u00e9gs\u0151 soron minden komponens egyetlen dologra fog v\u00e1rni.<\/p>\n<p><\/p>\n<p>Ez\u00e9rt fontos t\u00e9nyt kapunk \u2013 egy gyors decentraliz\u00e1lt rendszert nem lehet szinkroniz\u00e1lni, mivel ezzel cs\u00f6kkenten\u00e9nk a teljes\u00edtm\u00e9nyt. M\u00e1sr\u00e9szr\u0151l azonban gyakran sz\u00fcks\u00e9g\u00fcnk van bizonyos komponensek konzisztenci\u00e1j\u00e1ra. Erre alkalmazhatjuk a megk\u00f6zel\u00edt\u00e9st a <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">v\u00e9gs\u0151 konzisztencia<\/a><\/noindex>, ahol biztos\u00edtva van, hogy adatm\u00f3dos\u00edt\u00e1sok hi\u00e1ny\u00e1ban, egy id\u0151 ut\u00e1n az utols\u00f3 friss\u00edt\u00e9st k\u00f6vet\u0151en (\u201ev\u00e9gs\u0151 soron\u201d) minden k\u00e9r\u00e9s az utols\u00f3 friss\u00edtett \u00e9rt\u00e9ket fogja visszaadni.<\/p>\n<p><\/p>\n<p>Fontos meg\u00e9rteni, hogy a klasszikus adatb\u00e1zisok eset\u00e9ben gyakran alkalmazz\u00e1k a <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Consistency_model#Strict_consistency\">szigor\u00fa konzisztenci\u00e1t<\/a><\/noindex>, ahol minden csom\u00f3pontnak azonos inform\u00e1ci\u00f3val kell rendelkeznie (ez gyakran \u00fagy \u00e9rhet\u0151 el, hogy a tranzakci\u00f3t csak a m\u00e1sodik szerver v\u00e1lasz\u00e1nak vissza\u00e9rkez\u00e9se ut\u00e1n tekintik \u00e9rv\u00e9nyesnek). Itt n\u00e9mi enyh\u00edt\u00e9s van az izol\u00e1ci\u00f3s szintek miatt, de az alapelvek v\u00e1ltozatlanok \u2013 egy teljesen konzisztens vil\u00e1gban \u00e9lhet\u00fcnk.<\/p>\n<p><\/p>\n<p>De t\u00e9rj\u00fcnk vissza az eredeti feladathoz. Ha a rendszer egy r\u00e9sze <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">v\u00e9gs\u0151 konzisztencia<\/a><\/noindex>\u00e9p\u00edthet\u0151, akkor fel\u00e1ll\u00edthat\u00f3 a k\u00f6vetkez\u0151 s\u00e9ma.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/33c80be6bc33bd897ca9b9e5525f9ae8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A megk\u00f6zel\u00edt\u00e9s fontos jellemz\u0151i:<\/p>\n<p><\/p>\n<ul>\n<li>Minden bej\u00f6v\u0151 k\u00e9r\u00e9s egy sorba ker\u00fcl.<\/li>\n<li>A k\u00e9r\u00e9s feldolgoz\u00e1sa sor\u00e1n a szolg\u00e1ltat\u00e1s tov\u00e1bbi feladatokat is elhelyezhet m\u00e1s sorokban.<\/li>\n<li>Minden bej\u00f6v\u0151 esem\u00e9nynek van egy azonos\u00edt\u00f3ja (amely a deduplik\u00e1l\u00e1shoz sz\u00fcks\u00e9ges).<\/li>\n<li>A sor alapvet\u0151en az \"csak hozz\u00e1ad\u00e1s\" elv szerint m\u0171k\u00f6dik. Elemei nem t\u00f6r\u00f6lhet\u0151k vagy \u00e1trendezhet\u0151k.<\/li>\n<li>A sor FIFO (els\u0151 bej\u00f6v\u0151, els\u0151 kimen\u0151) elv alapj\u00e1n m\u0171k\u00f6dik (eln\u00e9z\u00e9st a tautol\u00f3gi\u00e1\u00e9rt). Ha p\u00e1rhuzamos v\u00e9grehajt\u00e1sra van sz\u00fcks\u00e9g, akkor a folyamat egyik szakasz\u00e1ban az objektumokat k\u00fcl\u00f6nb\u00f6z\u0151 sorokba kell \u00e1thelyezni.<\/li>\n<\/ul>\n<p><\/p>\n<p>Eml\u00e9keztetn\u00e9k r\u00e1, hogy az online f\u00e1jlmegoszt\u00f3 rendszert vizsg\u00e1ljuk. Ebben az esetben a rendszer k\u00f6r\u00fclbel\u00fcl \u00edgy fog kin\u00e9zni:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/b95efb29545dcde1db9432d12d00a1b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fontos, hogy a diagramon szerepl\u0151 szolg\u00e1ltat\u00e1sok nem felt\u00e9tlen\u00fcl jelentenek k\u00fcl\u00f6n\u00e1ll\u00f3 szervereket. M\u00e9g a folyamat is ugyanaz lehet. A l\u00e9nyeg m\u00e1s: ideol\u00f3giailag ezeket a dolgokat \u00fagy v\u00e1lasztott\u00e1k el, hogy k\u00f6nnyen alkalmazhat\u00f3 legyen a v\u00edzszintes sk\u00e1l\u00e1z\u00e1s.<\/p>\n<p><\/p>\n<p>K\u00e9t felhaszn\u00e1l\u00f3 eset\u00e9n a s\u00e9ma \u00edgy fog kin\u00e9zni (a k\u00fcl\u00f6nb\u00f6z\u0151 felhaszn\u00e1l\u00f3knak sz\u00e1nt szolg\u00e1ltat\u00e1sokat k\u00fcl\u00f6nb\u00f6z\u0151 sz\u00ednekkel jel\u00f6lik):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/4c4aadc8b9dd505c3ad743e69fee4fae.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az ilyen kombin\u00e1ci\u00f3 el\u0151nyei:<\/p>\n<p><\/p>\n<ul>\n<li>Az inform\u00e1ci\u00f3feldolgoz\u00f3 szolg\u00e1ltat\u00e1sok elk\u00fcl\u00f6n\u00fclnek. A k\u00fcldem\u00e9nyek is elk\u00fcl\u00f6n\u00fclnek. Ha n\u00f6veln\u00fcnk kell a rendszer \u00e1tereszt\u0151k\u00e9pess\u00e9g\u00e9t, csup\u00e1n t\u00f6bb szolg\u00e1ltat\u00e1st kell ind\u00edtanunk t\u00f6bb szerveren.<\/li>\n<li>Amikor inform\u00e1ci\u00f3t kapunk a felhaszn\u00e1l\u00f3t\u00f3l, nem musz\u00e1j megv\u00e1rnunk az adatok teljes ment\u00e9s\u00e9t. \u00c9ppen ellenkez\u0151leg, elegend\u0151 v\u00e1laszolnunk \u201erendben\u201d, majd fokozatosan elkezdhetj\u00fck a munk\u00e1t. A k\u00fcldem\u00e9nyek ugyanakkor sim\u00edtj\u00e1k a cs\u00facsokat, mivel az \u00faj objektumok gyorsan adhat\u00f3k hozz\u00e1, \u00e9s a felhaszn\u00e1l\u00f3nak nem kell v\u00e1rnia a teljes cikluson.<\/li>\n<li>P\u00e9ld\u00e1nak hoztam egy deduplik\u00e1l\u00f3 szolg\u00e1ltat\u00e1st, amely megpr\u00f3b\u00e1lja egyes\u00edteni az azonos f\u00e1jlokat. Ha ez az 1%-os esetekben hossz\u00fa ideig fut, a kliens szinte nem fogja \u00e9szrevenni (l\u00e1sd fent), ami nagy el\u0151ny, mivel m\u00e1r nem v\u00e1runk el 100%-os sebess\u00e9get \u00e9s megb\u00edzhat\u00f3s\u00e1got t\u0151l\u00fcnk.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ugyanakkor azonnal l\u00e1that\u00f3k a h\u00e1tr\u00e1nyok is:<\/p>\n<p><\/p>\n<ul>\n<li>A rendszer\u00fcnkb\u0151l hi\u00e1nyzik a szigor\u00fa koherencia. Ez azt jelenti, hogy ha p\u00e9ld\u00e1ul k\u00fcl\u00f6nb\u00f6z\u0151 szolg\u00e1ltat\u00e1sokra iratkozunk fel, elvileg k\u00fcl\u00f6nb\u00f6z\u0151 \u00e1llapotokat kaphatunk (mivel az egyik szolg\u00e1ltat\u00e1s nem biztos, hogy id\u0151ben megkapja a bels\u0151 k\u00fcldem\u00e9ny\u00e9rtes\u00edt\u00e9st). Mint egy m\u00e1sik k\u00f6vetkezm\u00e9ny, a rendszernek most nincs k\u00f6z\u00f6s ideje. Teh\u00e1t p\u00e9ld\u00e1ul nem lehet rendezni az \u00f6sszes esem\u00e9nyt egyszer\u0171en az \u00e9rkez\u00e9si id\u0151 alapj\u00e1n, mivel a szerverek k\u00f6z\u00f6tt l\u00e9v\u0151 \u00f3r\u00e1k nem szinkroniz\u00e1ltak (t\u00f6bbek k\u00f6z\u00f6tt, hogy k\u00e9t szerveren ugyanaz az id\u0151 egy ut\u00f3pia).<\/li>\n<li>Most m\u00e1r nem lehet egyszer\u0171en visszag\u00f6rgetni esem\u00e9nyeket (ahogy azt az adatb\u00e1zissal lehetne). Ehelyett \u00faj esem\u00e9nyt kell hozz\u00e1adni \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/49451237\/compensating-events-on-cqrs-es-architecture\">compensation event<\/a><\/noindex>, amely megv\u00e1ltoztatja az utols\u00f3 \u00e1llapotot a sz\u00fcks\u00e9gesre. P\u00e9ldak\u00e9nt egy hasonl\u00f3 ter\u00fcleten: t\u00f6rt\u00e9net \u00fajb\u00f3li \u00edr\u00e1sa n\u00e9lk\u00fcl (ami bizonyos esetekben rossz) a git-ben nem lehet visszag\u00f6rgetni egy commitot, azonban lehet\u0151s\u00e9g van egy speci\u00e1lis <noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/docs\/git-revert\">rollback commit<\/a><\/noindex>, amely alapvet\u0151en csak a r\u00e9gi \u00e1llapotot \u00e1ll\u00edtja vissza. Azonban a t\u00f6rt\u00e9netben megmarad a hib\u00e1s commit \u00e9s a rollback is.<\/li>\n<li>Az adats\u00e9ma a kiad\u00e1sokkal v\u00e1ltozhat, azonban a r\u00e9gi esem\u00e9nyeket most m\u00e1r nem lehet friss\u00edteni az \u00faj szabv\u00e1nyra (mivel az esem\u00e9nyeket elvileg nem lehet v\u00e1ltoztatni).<\/li>\n<\/ul>\n<p><\/p>\n<p>Ahogy l\u00e1that\u00f3, az Event Sourcing kiv\u00e1l\u00f3an m\u0171k\u00f6dik a CQRS-sel. S\u0151t, egy hat\u00e9kony \u00e9s k\u00e9nyelmes sorozat \u00e9rdek\u00e9ben, de an\u00e9lk\u00fcl, hogy az adatok folyamatait elv\u00e1lasztan\u00e1nk, m\u00e1r \u00f6nmag\u00e1ban is neh\u00e9z, mivel szinkroniz\u00e1l\u00e1si pontokat kell hozz\u00e1adni, amelyek cs\u00f6kkentik a sorok \u00f6sszes pozit\u00edv hat\u00e1s\u00e1t. Ha mindk\u00e9t megk\u00f6zel\u00edt\u00e9st egyszerre alkalmazzuk, akkor a program m\u0171k\u00f6d\u00e9s\u00e9nek k\u00f3dj\u00e1t enyh\u00e9n ki kell igaz\u00edtani. A mi eset\u00fcnkben, amikor f\u00e1jlt k\u00fcld\u00fcnk a szerverre, a v\u00e1laszban csak \"ok\" \u00e9rkezik, ami csak azt jelenti, hogy \"a f\u00e1jl hozz\u00e1ad\u00e1s\u00e1ra vonatkoz\u00f3 m\u0171velet megt\u00f6rt\u00e9nt\". Form\u00e1lisan ez nem jelenti, hogy az adatok m\u00e1r el\u00e9rhet\u0151k m\u00e1s eszk\u00f6z\u00f6k\u00f6n (p\u00e9ld\u00e1ul a deduplik\u00e1l\u00f3 szolg\u00e1ltat\u00e1s \u00fajra\u00e9p\u00edtheti az indexet). Azonban egy id\u0151 ut\u00e1n a kliens \u00e9rtes\u00edt\u00e9st kap, hogy \"az X f\u00e1jl mentve lett\".<\/p>\n<p><\/p>\n<p>Ennek eredm\u00e9nyek\u00e9nt:<\/p>\n<p><\/p>\n<ul>\n<li>A f\u00e1jlok k\u00fcld\u00e9s\u00e9nek st\u00e1tusza n\u0151: a klasszikus \"f\u00e1jl elk\u00fcldve\" helyett k\u00e9t st\u00e1tuszt kapunk: \"f\u00e1jl hozz\u00e1adva a szerver sor\u00e1hoz\" \u00e9s \"f\u00e1jl mentve a t\u00e1rol\u00f3ba\". Az ut\u00f3bbi azt jelenti, hogy m\u00e1s eszk\u00f6z\u00f6k m\u00e1r megkezdhetik a f\u00e1jl beszerz\u00e9s\u00e9t (figyelembe v\u00e9ve, hogy a sorok k\u00fcl\u00f6nb\u00f6z\u0151 sebess\u00e9ggel m\u0171k\u00f6dnek).<\/li>\n<li>Mivel az elk\u00fcld\u00e9s inform\u00e1ci\u00f3i most k\u00fcl\u00f6nb\u00f6z\u0151 csatorn\u00e1kon \u00e9rkeznek, megold\u00e1sokat kell kital\u00e1lnunk ahhoz, hogy megkapjuk a f\u00e1jl feldolgoz\u00e1s\u00e1nak st\u00e1tusz\u00e1t. Ebb\u0151l k\u00f6vetkezik, hogy ellent\u00e9tben a klasszikus k\u00e9r\u00e9s-v\u00e1lasz modellel, a kliens \u00fajraind\u00edthat\u00f3 a f\u00e1jl feldolgoz\u00e1sa k\u00f6zben, azonban a feldolgoz\u00e1s st\u00e1tusza helyes lesz. R\u00e1ad\u00e1sul ez a pont l\u00e9nyeg\u00e9ben dobozb\u00f3l ered\u0151en m\u0171k\u00f6dik. K\u00f6vetkez\u00e9sk\u00e9ppen most jobban toler\u00e1ljuk a hib\u00e1kat.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sharding\">Sharding<\/h1>\n<p><\/p>\n<p>Ahogy m\u00e1r kor\u00e1bban eml\u00edtett\u00fck, az esem\u00e9nyalap\u00fa rendszerekben nincs szigor\u00fa konzisztencia. Ez\u00e9rt haszn\u00e1lhatunk t\u00f6bb t\u00e1rol\u00f3t b\u00e1rmilyen szinkroniz\u00e1l\u00e1s n\u00e9lk\u00fcl. A feladatunkhoz k\u00f6zel\u00edtve, megtehetj\u00fck:<\/p>\n<p><\/p>\n<ul>\n<li>A f\u00e1jlokat t\u00edpusok szerint elosztani. P\u00e9ld\u00e1ul a k\u00e9peket\/vide\u00f3kat dek\u00f3dolhatjuk \u00e9s a hat\u00e9konyabb form\u00e1tumot v\u00e1laszthatjuk.<\/li>\n<li>Fi\u00f3kok orsz\u00e1gok szerint t\u00f6rt\u00e9n\u0151 sz\u00e9tv\u00e1laszt\u00e1sa. Sok t\u00f6rv\u00e9ny miatt ez sz\u00fcks\u00e9ges lehet, azonban ez az architektur\u00e1lis s\u00e9ma automatikusan lehet\u0151v\u00e9 teszi ezt.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/dd310df700bc39c014d0105a3425fece.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha adatokat szeretne \u00e1thelyezni egyik t\u00e1rol\u00f3b\u00f3l a m\u00e1sikba, akkor itt m\u00e1r nem haszn\u00e1lhat\u00f3k a hagyom\u00e1nyos eszk\u00f6z\u00f6k. Sajnos ilyen esetben meg kell \u00e1ll\u00edtani a sort, elv\u00e9gezni a migr\u00e1ci\u00f3t, majd \u00fajraind\u00edtani azt. \u00c1ltal\u00e1nos esetben az adatokat nem lehet \"\u00e9lesben\" \u00e1thelyezni, azonban ha az esem\u00e9nysor teljesen t\u00e1rolva van, \u00e9s van m\u00e1solatunk a t\u00e1rol\u00f3 el\u0151z\u0151 \u00e1llapotair\u00f3l, akkor \u00fajraj\u00e1tszhatjuk az esem\u00e9nyeket a k\u00f6vetkez\u0151 m\u00f3don:<\/p>\n<p><\/p>\n<ul>\n<li>Az Event Source-ban minden esem\u00e9nynek van egy azonos\u00edt\u00f3ja (ide\u00e1lisan nem cs\u00f6kken\u0151). Ez\u00e9rt a t\u00e1rol\u00f3hoz hozz\u00e1adhatunk egy mez\u0151t \u2014 az utols\u00f3 feldolgozott elem azonos\u00edt\u00f3j\u00e1t.<\/li>\n<li>Megkett\u0151zz\u00fck a sort, hogy minden esem\u00e9ny feldolgozhat\u00f3 legyen t\u00f6bb f\u00fcggetlen t\u00e1rol\u00f3 sz\u00e1m\u00e1ra (az els\u0151 az, amelyben jelenleg is t\u00e1rolva vannak az adatok, m\u00edg a m\u00e1sodik \u00faj, de egyel\u0151re \u00fcres). A m\u00e1sodik sort term\u00e9szetesen m\u00e9g nem dolgozzuk fel.<\/li>\n<li>Elind\u00edtjuk a m\u00e1sodik sort (azaz elkezdj\u00fck az esem\u00e9nyek \u00fajraj\u00e1tsz\u00e1s\u00e1t).<\/li>\n<li>Amikor az \u00faj sor viszonylag \u00fcres lesz (azaz az elemek hozz\u00e1ad\u00e1s\u00e1nak \u00e9s elt\u00e1vol\u00edt\u00e1s\u00e1nak k\u00f6z\u00f6tti \u00e1tlagos id\u0151elt\u00e9r\u00e9s elfogadhat\u00f3), el lehet kezdeni az olvas\u00f3k \u00e1tkapcsol\u00e1s\u00e1t az \u00faj t\u00e1rol\u00f3ra.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mint l\u00e1that\u00f3, a rendszer\u00fcnkben sohasem volt szigor\u00fa konzisztencia. Csak a v\u00e9gs\u0151 konzisztencia l\u00e9tezik, ami azt jelenti, hogy az esem\u00e9nyek ugyanabban a sorrendben ker\u00fclnek feldolgoz\u00e1sra (b\u00e1r elt\u00e9r\u0151 k\u00e9s\u00e9ssel). Ezt kihaszn\u00e1lva viszonylag egyszer\u0171en \u00e1t tudjuk helyezni az adatokat an\u00e9lk\u00fcl, hogy meg\u00e1ll\u00edtan\u00e1nk a rendszert a vil\u00e1g m\u00e1sik v\u00e9g\u00e9re.<\/p>\n<p><\/p>\n<p>\u00cdgy folytatva a p\u00e9ld\u00e1t az online f\u00e1jlt\u00e1rol\u00f3r\u00f3l, hasonl\u00f3 architekt\u00fara m\u00e1r sz\u00e1mos b\u00f3nuszt ad sz\u00e1munkra:<\/p>\n<p><\/p>\n<ul>\n<li>K\u00e9pesek vagyunk az objektumokat k\u00f6zelebb helyezni a felhaszn\u00e1l\u00f3khoz, dinamikusan. Ezzel jav\u00edthat\u00f3 a szolg\u00e1ltat\u00e1s min\u0151s\u00e9ge. <\/li>\n<li>A c\u00e9gek bels\u0151 adatokat is t\u00e1rolhatnak. P\u00e9ld\u00e1ul az Enterprise felhaszn\u00e1l\u00f3k gyakran megk\u00f6vetelik, hogy adataikat ellen\u0151rz\u00f6tt adatk\u00f6zpontokban t\u00e1rolj\u00e1k (elker\u00fclve az adatlop\u00e1st). A sharding seg\u00edts\u00e9g\u00e9vel k\u00f6nnyed\u00e9n t\u00e1mogatni tudjuk ezt. A feladat m\u00e9g egyszer\u0171bb\u00e9 v\u00e1lik, ha a megrendel\u0151nek van egy kompatibilis felh\u0151je (p\u00e9ld\u00e1ul, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-gb\/azure-stack\/asdk\/asdk-what-is?view=azs-1910\">Azure self hosted<\/a><\/noindex>).<\/li>\n<li>A legfontosabb dolog, hogy ezt nem musz\u00e1j megtenn\u00fcnk. Kezdetben el\u00e9g lenne egy t\u00e1rol\u00f3 minden fi\u00f3k sz\u00e1m\u00e1ra (hogy gyorsabban elkezdhess\u00fck a munk\u00e1t). Ennek a rendszernek a kulcsfontoss\u00e1g\u00fa jellemz\u0151je az, hogy b\u00e1r b\u0151v\u00edthet\u0151, kezdetben eg\u00e9sz egyszer\u0171. Csak annyira van sz\u00fcks\u00e9g, hogy ne kelljen azonnal olyan k\u00f3dot \u00edrni, amely milli\u00f3nyi k\u00fcl\u00f6n\u00e1ll\u00f3 f\u00fcggetlen sorral dolgozik, stb. Ha sz\u00fcks\u00e9ges, ezt a j\u00f6v\u0151ben meg lehet csin\u00e1lni.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"static-content-hosting\">Statikus Tartalom T\u00e1rhely<\/h1>\n<p><\/p>\n<p>Ez a pont tal\u00e1n teljesen nyilv\u00e1nval\u00f3nak t\u0171nik, m\u00e9gis n\u00e9lk\u00fcl\u00f6zhetetlen egy viszonylag standard, nagy terhel\u00e9s\u0171 alkalmaz\u00e1shoz. A l\u00e9nyege egyszer\u0171: az \u00f6sszes statikus tartalom nem arr\u00f3l a szerverr\u0151l ker\u00fcl kiad\u00e1sra, ahol az alkalmaz\u00e1s tal\u00e1lhat\u00f3, hanem speci\u00e1lis, kifejezetten erre a c\u00e9lra kijel\u00f6lt szerverekr\u0151l. Ennek k\u00f6vetkezm\u00e9nyek\u00e9nt ezek a m\u0171veletek gyorsabban hajt\u00f3dnak v\u00e9gre (a felt\u00e9telezett nginx gyorsabban \u00e9s k\u00f6lts\u00e9ghat\u00e9konyabban szolg\u00e1ltat f\u00e1jlokat, mint a Java-szerver). R\u00e1ad\u00e1sul a CDN architekt\u00fara (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Content_delivery_network\">Tartalom Szolg\u00e1ltat\u00f3 H\u00e1l\u00f3zat<\/a><\/noindex>) lehet\u0151v\u00e9 teszi, hogy a f\u00e1jljainkat k\u00f6zelebb helyezz\u00fck a v\u00e9gfelhaszn\u00e1l\u00f3khoz, ami pozit\u00edvan hat a szolg\u00e1ltat\u00e1s haszn\u00e1lhat\u00f3s\u00e1g\u00e1ra.<\/p>\n<p><\/p>\n<p>A legjobb \u00e9s legtipikusabb p\u00e9lda statikus tartalomra egy weboldalhoz tartoz\u00f3 script- \u00e9s k\u00e9pgy\u0171jtem\u00e9ny. Ezekkel minden egyszer\u0171: el\u0151re ismertek, majd az arch\u00edvumot felt\u00f6ltj\u00fck a CDN szerverekre, ahonnan a v\u00e9gfelhaszn\u00e1l\u00f3khoz ter\u00edtj\u00fck \u0151ket.<\/p>\n<p><\/p>\n<p>Val\u00f3j\u00e1ban azonban a statikus tartalomra egy olyan megk\u00f6zel\u00edt\u00e9st is alkalmazhatunk, amely hasonl\u00edt a lambda architekt\u00far\u00e1hoz. T\u00e9rj\u00fcnk vissza a feladatunkhoz (online f\u00e1jlt\u00e1rol\u00f3), amelyben a felhaszn\u00e1l\u00f3knak f\u00e1jlokat kell szolg\u00e1ltatnunk. A legegyszer\u0171bb megold\u00e1s k\u00f6zvetlen\u00fcl az, hogy l\u00e9trehozunk egy szolg\u00e1ltat\u00e1st, amely minden egyes felhaszn\u00e1l\u00f3i k\u00e9r\u00e9sre elv\u00e9gez minden sz\u00fcks\u00e9ges ellen\u0151rz\u00e9st (hiteles\u00edt\u00e9s stb.), majd let\u00f6lti a f\u00e1jlt k\u00f6zvetlen\u00fcl a t\u00e1rol\u00f3nkb\u00f3l. Ennek a megk\u00f6zel\u00edt\u00e9snek a legnagyobb h\u00e1tr\u00e1nya, hogy a statikus tartalmat (mivel a meghat\u00e1rozott verzi\u00f3j\u00fa f\u00e1jl val\u00f3j\u00e1ban statikus tartalom) ugyanaz a szerver szolg\u00e1ltatja, amely tartalmazza az \u00fczleti logik\u00e1t. Ehelyett l\u00e9trehozhatunk egy k\u00f6vetkez\u0151 s\u00e9m\u00e1t:<\/p>\n<p><\/p>\n<ul>\n<li>A szerver URL-t ad a let\u00f6lt\u00e9shez. Ez lehet file_id + key form\u00e1tum\u00fa, ahol a key egy mini digit\u00e1lis al\u00e1\u00edr\u00e1s, amely jogot ad a forr\u00e1shoz val\u00f3 hozz\u00e1f\u00e9r\u00e9shez a k\u00f6vetkez\u0151 egy napra.<\/li>\n<li>A f\u00e1jlter\u00edt\u00e9shez egy egyszer\u0171 nginx felel, a k\u00f6vetkez\u0151 opci\u00f3kkal:\n<ul>\n<li>Tartalom gyors\u00edt\u00f3t\u00e1raz\u00e1sa. Mivel ez a szolg\u00e1ltat\u00e1s k\u00fcl\u00f6n szerveren lehet, a j\u00f6v\u0151beni ig\u00e9nyekre is k\u00e9sz\u00edtett\u00fcnk n\u00e9mi tartal\u00e9kot az utols\u00f3 let\u00f6lt\u00f6tt f\u00e1jlok lemezen val\u00f3 t\u00e1rol\u00e1s\u00e1nak lehet\u0151s\u00e9g\u00e9vel.<\/li>\n<li>A kulcs ellen\u0151rz\u00e9se a kapcsolat l\u00e9trehoz\u00e1s\u00e1nak pillanat\u00e1ban.<\/li>\n<\/ul>\n<\/li>\n<li>Opcion\u00e1lisan: tartalom folyamatos feldolgoz\u00e1sa. P\u00e9ld\u00e1ul, ha minden f\u00e1jlt t\u00f6m\u00f6r\u00edt\u00fcnk a szolg\u00e1ltat\u00e1sban, akkor a kicsomagol\u00e1st k\u00f6zvetlen\u00fcl ebben a modulban v\u00e9gezhetj\u00fck. Ennek k\u00f6vetkezt\u00e9ben: az I\/O m\u0171veletek ott zajlanak, ahol a legjobban illenek. A Java alap\u00fa arch\u00edv\u00e1l\u00f3 sok felesleges mem\u00f3ri\u00e1t ig\u00e9nyelhet, de a szolg\u00e1ltat\u00e1s \u00e1t\u00edr\u00e1sa \u00fczleti logik\u00e1val \u00e1llapotgyakran haszn\u00e1lt Rust\/C++ nyelvekre szint\u00e9n nem biztos, hogy hat\u00e9kony. Az eset\u00fcnkben k\u00fcl\u00f6nb\u00f6z\u0151 folyamatokat (vagy ak\u00e1r szolg\u00e1ltat\u00e1sokat) haszn\u00e1lunk, \u00edgy hat\u00e9konyan sz\u00e9tv\u00e1laszthat\u00f3 az \u00fczleti logika \u00e9s az I\/O m\u0171veletek.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/4dead07d5824938e09b986192ccc8f5e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez a s\u00e9ma nem t\u00fals\u00e1gosan hasonl\u00edt a statikus tartalom terjeszt\u00e9s\u00e9re (mivel nem t\u00f6ltj\u00fck fel az \u00f6sszes statikus csomagot valahova), de a val\u00f3s\u00e1gban ez a megk\u00f6zel\u00edt\u00e9s \u00e9ppen az immutable adatok terjeszt\u00e9s\u00e9vel foglalkozik. S\u0151t, ezt a s\u00e9m\u00e1t m\u00e1s esetekre is \u00e1ltal\u00e1nos\u00edthatjuk, amikor a tartalom nemcsak statikus, hanem egy nem m\u00f3dos\u00edthat\u00f3 \u00e9s nem t\u00f6r\u00f6lhet\u0151 blokkok \u00f6sszess\u00e9gek\u00e9nt is megjelenhet (b\u00e1r ezek hozz\u00e1adhat\u00f3k).<\/p>\n<p><\/p>\n<p>Egy m\u00e1sik p\u00e9lda (a meger\u0151s\u00edt\u00e9shez): ha dolgozott m\u00e1r a Jenkins-szel vagy a TeamCity-vel, akkor tudja, hogy mindk\u00e9t megold\u00e1s Java nyelven \u00edr\u00f3dott. Mindketten Java-folyamatok, amelyek a build orkestr\u00e1l\u00e1s\u00e1t \u00e9s a tartalomkezel\u00e9st v\u00e9gzik. K\u00fcl\u00f6n\u00f6sen mindkett\u0151nek van olyan feladata, mint \"\u00e1tadni egy f\u00e1jlt\/mapp\u00e1t a szerverr\u0151l\". P\u00e9ld\u00e1ul: artefaktumok kiad\u00e1sa, a forr\u00e1sk\u00f3d \u00e1tad\u00e1sa (amikor az \u00fcgyn\u00f6k nem k\u00f6zvetlen\u00fcl a repozit\u00f3riumb\u00f3l t\u00f6lti le a k\u00f3dot, hanem a szerver v\u00e9gzi ezt), hozz\u00e1f\u00e9r\u00e9s a napl\u00f3khoz. Mindezek a feladatok elt\u00e9r\u0151 IO-terhel\u00e9ssel j\u00e1rnak. Teh\u00e1t az a szerver, amely a bonyolult \u00fczleti logik\u00e1\u00e9rt felel\u0151s, hat\u00e9konyan kell, hogy k\u00e9pes legyen nagy adatfolyamok \u00e1th\u00faz\u00e1s\u00e1ra. \u00c9s ami a leg\u00e9rdekesebb, hogy az ilyen m\u0171veletet ugyanannak az nginx-nek is lehet deleg\u00e1lni pontosan ugyanazzal az elvvel (csak az adatkulcsot kell hozz\u00e1adni a k\u00e9r\u00e9shez).<\/p>\n<p><\/p>\n<p>Ha azonban visszat\u00e9r\u00fcnk a rendszer\u00fcnkh\u00f6z, akkor a k\u00f6vetkez\u0151 s\u00e9ma j\u00f6n l\u00e9tre:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"K\u00e9nyelmes architektur\u00e1lis mint\u00e1k\" src=\"\/wp-content\/uploads\/2020\/05\/97cfbf5daaa6678a9eecc3169692f0fc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Amint l\u00e1that\u00f3, a rendszer radik\u00e1lisan bonyolultabb\u00e1 v\u00e1lt. Most m\u00e1r nem csup\u00e1n egy mini-processzor, amely helyben t\u00e1rolja a f\u00e1jlokat. Most m\u00e1r nem a legegyszer\u0171bb t\u00e1mogat\u00e1sra van sz\u00fcks\u00e9g, API verzi\u00f3ellen\u0151rz\u00e9sre stb. Ez\u00e9rt, miut\u00e1n minden diagramot elk\u00e9sz\u00edtettek, a legjobb, ha r\u00e9szletesen \u00e9rt\u00e9kelj\u00fck, hogy meg\u00e9rik-e az ilyen k\u00f6lts\u00e9gek a sk\u00e1l\u00e1zhat\u00f3s\u00e1g. Azonban ha szeretn\u00e9 b\u0151v\u00edteni a rendszert (bele\u00e9rtve m\u00e9g t\u00f6bb felhaszn\u00e1l\u00f3 kezel\u00e9s\u00e9t), akkor ilyen megold\u00e1sokra lesz sz\u00fcks\u00e9g. Ennek k\u00f6sz\u00f6nhet\u0151en a rendszer architekt\u00far\u00e1ja k\u00e9szen \u00e1ll a terhel\u00e9s n\u00f6vel\u00e9s\u00e9re (gyakorlatilag minden komponenst kl\u00f3nozni lehet a v\u00edzszintes sk\u00e1l\u00e1z\u00e1s \u00e9rdek\u00e9ben). A rendszert le\u00e1ll\u00edt\u00e1s n\u00e9lk\u00fcl lehet friss\u00edteni (csak n\u00e9h\u00e1ny m\u0171velet kiss\u00e9 lelassul).<\/p>\n<p><\/p>\n<p>Ahogy az elej\u00e9n m\u00e1r eml\u00edtettem, mostan\u00e1ban t\u00f6bb internetes szolg\u00e1ltat\u00e1s is fokozott terhel\u00e9st kap. N\u00e9h\u00e1nyuk egyszer\u0171en le\u00e1llt a megfelel\u0151 m\u0171k\u00f6d\u00e9sr\u0151l. A rendszerek gyakorlatilag akkor mondt\u00e1k fel a szolg\u00e1latot, amikor a v\u00e1llalkoz\u00e1snak p\u00e9nzt kellett volna keresnie. Teh\u00e1t ahelyett, hogy k\u00e9sleltetett sz\u00e1ll\u00edt\u00e1st k\u00edn\u00e1ln\u00e1nak, vagy azt javasoln\u00e1k az \u00fcgyfeleknek, hogy \"tervezz\u00e9k meg a sz\u00e1ll\u00edt\u00e1st a k\u00f6vetkez\u0151 h\u00f3napokban\", a rendszer egyszer\u0171en azt mondta: \"menjetek a versenyt\u00e1rsakhoz\". Val\u00f3j\u00e1ban ez az alacsony teljes\u00edtm\u00e9ny \u00e1ra: a vesztes\u00e9gek pont akkor fordulnak el\u0151, amikor a nyeres\u00e9g a legmagasabb lenne.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Z\u00e1r\u00e1s<\/h1>\n<p><\/p>\n<p>Mindezek a megk\u00f6zel\u00edt\u00e9sek m\u00e1r r\u00e9g\u00f3ta ismertek. A VK m\u00e1r r\u00e9g\u00f3ta haszn\u00e1lja a statikus tartalom t\u00e1rol\u00e1s\u00e1nak \u00f6tlet\u00e9t a k\u00e9pek megjelen\u00edt\u00e9s\u00e9re. Sz\u00e1mos online j\u00e1t\u00e9k alkalmaz egy sharding rendszert a j\u00e1t\u00e9kosok region\u00e1lis eloszt\u00e1s\u00e1ra vagy a j\u00e1t\u00e9kt\u00e9rk\u00e9pek megoszt\u00e1s\u00e1ra (ha a vil\u00e1g egys\u00e9ges). Az esem\u00e9nyforr\u00e1s megk\u00f6zel\u00edt\u00e9st akt\u00edvan haszn\u00e1lj\u00e1k az elektronikus levelez\u00e9sben. A keresked\u0151k t\u00f6bbs\u00e9gi alkalmaz\u00e1sai, ahol folyamatosan \u00e9rkeznek az adatok, val\u00f3j\u00e1ban a CQRS megk\u00f6zel\u00edt\u00e9sen alapulnak, hogy sz\u0171rni tudj\u00e1k a be\u00e9rkez\u0151 adatokat. A v\u00edzszintes sk\u00e1l\u00e1z\u00e1st pedig m\u00e1r r\u00e9gen alkalmazz\u00e1k sz\u00e1mos szolg\u00e1ltat\u00e1sban.<\/p>\n<p><\/p>\n<p>Ami a legfontosabb, hogy ezek a mint\u00e1k mostan\u00e1ban nagyon k\u00f6nnyen alkalmazhat\u00f3ak a modern alkalmaz\u00e1sokban (ha persze relev\u00e1nsak). A felh\u0151k k\u00edn\u00e1lnak shardingot \u00e9s v\u00edzszintes sk\u00e1l\u00e1z\u00e1st egyszerre, ami sokkal k\u00f6nnyebb, mint k\u00fcl\u00f6nb\u00f6z\u0151 dedik\u00e1lt szerverek rendel\u00e9se a k\u00fcl\u00f6nb\u00f6z\u0151 adatk\u00f6zpontokban. A CQRS haszn\u00e1lata is sokkal egyszer\u0171bb lett, legal\u00e1bbis az RX bibliot\u00e9k\u00e1k fejl\u0151d\u00e9se miatt. T\u00edz \u00e9ve egy weboldal ritk\u00e1n tudta volna ezt t\u00e1mogatni. Az esem\u00e9nyalap\u00fa forr\u00e1sgy\u0171jt\u00e9s is hihetetlen\u00fcl k\u00f6nnyen be\u00e1ll\u00edthat\u00f3, k\u00f6sz\u00f6nhet\u0151en az Apache Kafka-hoz k\u00e9sz\u00fclt kont\u00e9nereknek. T\u00edz \u00e9ve ez innov\u00e1ci\u00f3nak sz\u00e1m\u00edtott, ma m\u00e1r a megszokott. Hasonl\u00f3 a statikus tartalom hostinggal: a k\u00e9nyelmesebb technol\u00f3gi\u00e1knak (t\u00f6bbek k\u00f6z\u00f6tt a r\u00e9szletes dokument\u00e1ci\u00f3 \u00e9s a nagy v\u00e1laszadatb\u00e1zis miatt) ez a megk\u00f6zel\u00edt\u00e9s m\u00e9g egyszer\u0171bb\u00e9 v\u00e1lt.<\/p>\n<p><\/p>\n<p>\u00d6sszess\u00e9g\u00e9ben a t\u00f6bb el\u00e9g bonyolult architekt\u00fara minta megval\u00f3s\u00edt\u00e1sa most sokkal egyszer\u0171bb\u00e9 v\u00e1lt, ez\u00e9rt \u00e9rdemes el\u0151re megfontolni. Ha egy \u00e9vtizeddel ezel\u0151tt egy alkalmaz\u00e1s elvetett egy fenti megold\u00e1st a bevezet\u00e9s \u00e9s m\u0171k\u00f6dtet\u00e9s magas k\u00f6lts\u00e9ge miatt, akkor most, egy \u00faj alkalmaz\u00e1s eset\u00e9n, vagy a refaktor\u00e1l\u00e1s ut\u00e1n, kialak\u00edthat\u00f3 egy olyan szolg\u00e1ltat\u00e1s, amely architekt\u00far\u00e1j\u00e1ban m\u00e1r b\u0151v\u00edthet\u0151 (teljes\u00edtm\u00e9ny szempontj\u00e1b\u00f3l), \u00e9s k\u00e9pes lesz \u00faj \u00fcgyf\u00e9lig\u00e9nyek kiszolg\u00e1l\u00e1s\u00e1ra (p\u00e9ld\u00e1ul a szem\u00e9lyes adatok lokaliz\u00e1l\u00e1s\u00e1hoz).<\/p>\n<p><\/p>\n<p>\u00c9s ami a legfontosabb: k\u00e9rj\u00fck, ne haszn\u00e1lja ezeket a megk\u00f6zel\u00edt\u00e9seket, ha az alkalmaz\u00e1sa egyszer\u0171. Igen, sz\u00e9pek \u00e9s \u00e9rdekesek, de egy 100 f\u0151s cs\u00facsforgalm\u00fa weboldal eset\u00e9n gyakran elegend\u0151 egy klasszikus monolit (legal\u00e1bbis k\u00edv\u00fclr\u0151l, bel\u00fcl m\u00e1r minden modulis\u00edthat\u00f3, stb.).<\/p>\n<p>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dbtc\/blog\/499758\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0432 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430 \u0441\u0430\u0439\u0442 \u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0418 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e (\u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0439\u0434\u0443\u0442 \u043a \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c). \u0412 \u044d\u0442\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80036,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80035","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0434\u043e\u0431\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-02T11:42:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-02T11:42:54+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47K\u00e9nyelmes architekt\u00far\u00e1k | ProHoster","description":"Hell\u00f3, Habr! A koronav\u00edrus miatt bek\u00f6vetkezett esem\u00e9nyek f\u00e9ny\u00e9ben sz\u00e1mos internetes szolg\u00e1ltat\u00e1s n\u00f6vekv\u0151 terhel\u00e9st kapott.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0434\u043e\u0431\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-02T11:42:54+00:00","article:modified_time":"2020-05-02T11:42:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80035","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:26:40","updated":"2022-09-28 01:38:29","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/80035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=80035"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/80035\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/80036"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=80035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=80035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=80035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}