From 27c40dfdcbfd2bf8a08c0d8bee9bf78a1d8812ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torma=20Krist=C3=B3f?= Date: Tue, 12 May 2020 16:21:54 +0200 Subject: [PATCH] use pdf for vector graphics --- src/content/beggining.tex | 2 +- src/content/work.tex | 12 +++++++----- src/figures/architecture-simple.pdf | Bin 0 -> 11565 bytes src/figures/architecture-simple.png | Bin 32455 -> 0 bytes src/thesis.tex | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 src/figures/architecture-simple.pdf delete mode 100644 src/figures/architecture-simple.png diff --git a/src/content/beggining.tex b/src/content/beggining.tex index b41d459..a738f7e 100644 --- a/src/content/beggining.tex +++ b/src/content/beggining.tex @@ -19,7 +19,7 @@ A felhőalapú számítástechnikában a felhasználó elől elrejtve, a szolgá \subsubsection{Kubernetes} A Kubernetes egy Go nyelven írt, nyílt forráskódú konténer orkesztrációs platform, amely képes konténerek automatikus konfigurációjára, skálázására, valamint bizonyos hibák automatikus elhárítására is. Több konténer technológiát \cite{kubernetes-runtimes} támogat, köztük a Dockert is. Nagyon népszerű, gyors fejlesztés alatt álló projekt. Emiatt felhasználói és programozói interfésze gyakran változik, megkövetelve a ráépülő megoldásoktól a hasonló sebességű fejlesztést. Jól definiált interfésze miatt sok ráépülő, azt kiegészítő projekt létezik. A Kubernetes kiváló keretet nyújt mikroszolgáltatás alapú alkalmazások fejlesztésére. -Egy Kubernetes klaszterben két típusú hosztgép lehet. Mindkettőből lehet több darab, de legalább egy-egy példány kötelező. A \ref{fig:k8s-chart} \'abr\'an l\'athat\'o, hogy egy Kubernetes klaszter \cite{kubernetes-nodes} legal\'abb egy Masterből \'es Workerből \'ep\"ul fel, ezek több komponensből állnak. +Egy Kubernetes klaszterben két típusú hosztgép lehet. Mindkettőből lehet több darab, de legalább egy-egy példány kötelező. Egy Kubernetes klaszter \cite{kubernetes-nodes} legal\'abb egy Masterből \'es Workerből \'ep\"ul fel, ezek több komponensből állnak. A Kubernetes Master felelős a klaszterben lezajló folyamatok \cite{kubernetes-concepts} irányításáért, a Slave-ek vagy más néven Worker-ek, valamint az alkalmazások állapotának nyilvántartásáért. A klaszterben történő eseményekre válaszul klaszterszintű választ ad - például egy pod elindítása. Egy Master node számos komponensből áll, ezek a Master egy-egy feladatáért felelnek. Több Master node futtatása esetén - úgynevezett multimaster mode - csak az API Server \cite{kubernetes-api} és az etcd \cite{etcd} komponensekből jön létre több példány, a többiből egyszerre csak egy példány lehet aktív.A Pod \cite{kubernetes-pods} egy vagy több konténert összefogó logikai hoszt. Egy podon belül lévő konténerek osztoznak a hálózaton és a háttértáron, valamint azonos a futtatási specifikációjuk. Ez azt jelenti, hogy az egy podon belüli konténerek localhost-on keresztül elérik egymást, valamint van lehetőség, hogy a konténerekben futó alkalmazások lássák a másik konténerben futó folyamatokat. Egy Kubernetes rendszerben a Pod a legkisebb egység, amit futásra lehet ütemezni. diff --git a/src/content/work.tex b/src/content/work.tex index 73490c8..4dbbfe3 100644 --- a/src/content/work.tex +++ b/src/content/work.tex @@ -9,7 +9,7 @@ Jelenleg a rendszer csővezetékként működik, egyik végén beérkeznek a bem \begin{figure}[!ht] \centering -\includegraphics[width=120mm, keepaspectratio]{figures/architecture-simple.png} +\includegraphics[width=\textwidth]{figures/architecture-simple.pdf} \caption{A rendszer komponensei \'es azok k\"oz\"otti kapcsolatok} \label{fig:birbnetes-architecture} \end{figure} @@ -21,7 +21,7 @@ Fogadja a bemeneti hangfájlokat, ezeket továbbítja a hosszú idejű tárolás Kapcsolódik egy relációs adatbázishoz, amelyben lementi az információkat, amelyeket fogadott a hangfájllal együtt. Ezeket összerendeli az egyedi azonosítóval, amelyet ő adott a hangfájlnak. -Miután a Storage Service lementette a hangfájlt, a service publikál egy üzenetet az üzenetsorba, amely tartalmazza a mentett hangfájl címkéjét. A feliratkozott komponensek ezekután a tag használatával letölthetik a lementett hangot és folytathatják rajta a feldolgozást. +Miután a Storage Service lementette a hangfájlt, a service publikál egy üzenetet az üzenetsorba, amely tartalmazza a mentett hangfájl címkéjét. A feliratkozott komponensek ezekután a c\'imke használatával letölthetik a lementett hangot és folytathatják rajta a feldolgozást. \subsubsection{Independent Results Service} Feldolgozza a mesterséges intelligencia kimenetét, letárolja azt egy tetszőleges relációs adatbázisban. Lekérdezhető tőle - egymástól függetlenül - az egyes hangfájlokról hozott döntés. Az itt tárolt adatok összevethetők az Input Service-ben található adatokkal. Ez segíthet a hiba keresésben, valamint az itt található adatok segítségével a rendszerbe tanulás illeszthető. @@ -30,13 +30,13 @@ Feldolgozza a mesterséges intelligencia kimenetét, letárolja azt egy tetszől Feldolgozza a mesterséges intelligencia kimenetét. Az eredményeket egy idősoros adatbázisban tárolja le. Ez az adatbázis sokkal alkalmasabb és hatékonyabb az eredmények "mérés" szerű kezelésén, de cserébe nem lehet lekérni tőle egyesével a hangfájlokról hozott döntéseket. Használata lehetővé teszi dashboardok készítését, ahol heat-map vagy más grafikonok segítségével tájékozódhat a felhasználó. \subsection{API-k tervez\'ese} -Mivel a projekten ketten dolgoztunk, fontos volt számunkra az egyes szolgáltatások API-jainak definiálása. Erre Swagger-t használtunk, ami egy jól dokumentált, nyitott definíciós eszköztár RESTful API-k leírására. Itt lényeges volt számomra, hogy az elvárt bemeneti formátumon felül minden lehetséges visszatérési státusz kódja és üzenetformátuma dokumentálva legyen az általam fejlesztett szolgáltatásoknak, ugyanis ez megkönnyíti a fejlesztést és a lehetséges félreértéseket is elkerüli. A rendszerben bevezettük a címkék vagy tagek fogalmát, amely egyedi azonosítója minden beküldött hangfájlnak. Az egyes tagekhez tárolt metaadatokat is le lehet kérdezni egy endpoint segítségével. +Mivel a projekten ketten dolgoztunk, fontos volt számunkra az egyes szolgáltatások API-jainak definiálása. Erre Swagger-t használtunk, ami egy jól dokumentált, nyitott definíciós eszköztár RESTful API-k leírására. Itt lényeges volt számomra, hogy az elvárt bemeneti formátumon felül minden lehetséges visszatérési státusz kódja és üzenetformátuma dokumentálva legyen az általam fejlesztett szolgáltatásoknak, ugyanis ez megkönnyíti a fejlesztést és a lehetséges félreértéseket is elkerüli. A rendszerben bevezettük a címkék fogalmát, amely egyedi azonosítója minden beküldött hangfájlnak. Az egyes c\'imk\'ekhez tárolt metaadatokat is le lehet kérdezni egy endpoint segítségével. Az Input Service API-ján kifejezetten sokat gondolkodtam, ugyanis a fájlok és az azokat kísérő metaadatok fogadására több alternatíva létezik. Állományok feltöltése miatt adódik a http mulipart form használata, viszont a metaadatok kerülhetnek külön részbe a kérésnek, vagy egybe valamilyen JSON formátumú adatstruktúrában. Végül az utóbbi mellett döntöttem, ugyanis Pythonhoz rendkívül kiforrott JSON sémavalidációs könyvtárak érhetők el, ezzel szemben ilyen eszközt, ami elegánsan képes multipart formok sémáját validálni, nem találtam. A Results Statistics Service nem szolgál ki REST-es API-t, csupán fogadja a message queue-n érkező eredményeket és azokat letárolja a hozzá kapcsolódó timeseries adatbázisban. -Ez előbbivel szemben az Independent Results Service egyik legfontosabb tulajdonsága, hogy egy REST API-t nyújt. Itt kihasználva a relációs adatbázis által nyújtott lehetőségeket definiáltam olyan végpontokat, melyek visszaadnak minden pozitív vagy negatív eredményt, valamint adott dátum előtt, illetve után rögzített eredményeket. A cél az volt, hogy le lehessen kérdezni azegyes hangfájlokhoz tartozó adatokat, és ezt egy olyan endpoint segítségével lehet megtenni, amelyben a hangfájl tagje alapján azonosítható ez be. +Ez előbbivel szemben az Independent Results Service egyik legfontosabb tulajdonsága, hogy egy REST API-t nyújt. Itt kihasználva a relációs adatbázis által nyújtott lehetőségeket definiáltam olyan végpontokat, melyek visszaadnak minden pozitív vagy negatív eredményt, valamint adott dátum előtt, illetve után rögzített eredményeket. A cél az volt, hogy le lehessen kérdezni azegyes hangfájlokhoz tartozó adatokat, és ezt egy olyan endpoint segítségével lehet megtenni, amelyben a hangfájl c\'imk\'eje alapján azonosítható ez be. \subsection{Fejleszt\'es folyamata} Fejlesztés során igyekeztem arra figyelni, hogy az általam írt kód helyes legyen, ezért a projekthez beállítottam egy folyamatos integrációs rendszert, amely minden git commitra lefuttatott teszteket, és amennyiben a kód átment ezeken a tesztken, container image-et épített és publikált az általam beállított container registry-be. Később a Kubernetes rendszerbe is innen kerültek be az egyes mikroszolgáltatások. @@ -113,7 +113,7 @@ A Kubernetes-natív kategóriába sorolható API Gatewayek közé tartozik a Kon Alternatíva az Ambassador használata, ami a háttérben Envoy-t használ. Szintén támogat minden fontos képességet, viszont hátránya, hogy konfigurációja label-be ágyazott YAML segítségével lehetséges. Ez nem kívánatos, hiszen erre Custom Resource Definitionöket hibabiztosabban és flexibilisebben lehetne használni. -Megvizsgáltam továbbáa Gloo-t, aminek különleges előnye, hogy képes automatikusan alkalmazások API-jának automatikus felismerésére OpenAPI definíciók segítségével, amiket mi a fejlesztési folyamat elején definiáltunk. +Megvizsgáltam továbbá a Gloo-t, aminek különleges előnye, hogy képes automatikusan alkalmazások API-jának automatikus felismerésére OpenAPI definíciók segítségével, amiket mi a fejlesztési folyamat elején definiáltunk. A választásom végül a Kong-ra esett, mert számomra szimpatikus volt, hogy egy egyszerű NGINX webszerver segítségével oldja meg funkcióit. A telepítést ez után az Ingress objektumok definiálásával és a klaszterbe telepítésével folytattam. @@ -122,6 +122,8 @@ A mikroszolgáltatások fejlesztése közben önmagukban teszteltem őket és pr Előkerültek olyan hibák, amik eltérő feltételezésekből következnek. Ezen esetekben egyeztettük a konvencióink, majd a javítás után újra teszteltük a működést. +A folyamat eredm\'enyek\'ek\'ent kaptunk egy műk\"odő rendszert, aminek minden komponense k\'epes volt egym\'assal egy\"uttműk\"odni. Beadtunk p\'eld\'aul egy olyan hangf\'ajlt, amely sereg\'ely \'eneket \'es egy olyat, amin motorhang volt. R\"ovid idő eltelt\'evel lek\'erzhető volt az eredm\'eny az Independent Results Service-től, mindkettőt motorhangk\'ent klasszifik\'alta az MI. Ugyanekor az InfluxDB-ből lek\'erezhető volt az időpontokban t\"ort\'ent m\'er\'esek. Ez nem probl\'ema a mi projekt\"unk szempontj\'ab\'ol, elv\'egre a f\'el\'ev elej\'en kiindul\'o felt\'etelez\'es\"unk volt, hogy az MI modellek adottak, azokon nem c\'elunk v\'altoztatni, azokat jav\'itani. + \subsection{\"Osszefoglal\'as} A félév során számos új tudással bővültem, többek között elsajátítottam a Kotlin nyelv alapszintű működését, valamint megtanultam, hogy kell mikroszolgáltatás alapú rendszert tervezni, fejleszteni és az ezek Kubernetesbe telepítésével kapcsolatos megontolásokat is részletesebben megismertem. Több technológia működésébe nyertem betekintést, ezzel tágítva az eszköztáram. diff --git a/src/figures/architecture-simple.pdf b/src/figures/architecture-simple.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f435b174dd6daa0da012fdc8db002d2b4ec95cc9 GIT binary patch literal 11565 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 literal 0 HcmV?d00001 diff --git a/src/figures/architecture-simple.png b/src/figures/architecture-simple.png deleted file mode 100644 index 4c95f193ccedcbecbf8cf6d6060a93d9eaa960df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32455 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 tL-UT