2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
\chapter { A vizualizálni kívánt rendszer bemutatása}
2020-11-27 15:37:25 +01:00
\label { chapt:birdnetes-introduction}
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
Az alkalmazásom célja egy létező rendszer, a Birbnetes folyamatainak vizualizálása.
Ebben a fejezetben ismertetem a Birbnetes mikroszolgáltatás rendszerének architektúráját és az általa használt technológiákat.
2020-11-27 15:37:25 +01:00
Részletesen kifejtem az alkalmazásom szempontjából fontos komponensek feladatát és működését.
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
\section { Elméleti összefoglaló}
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
A bemutatásra kerülő rendszert a tanszéken egy projekt keretén belül készítették kollégáim,
melyet részletesen dokumentálták korábbi nyilvános publikációkban \cite { birdnetes-tdk} \cite { birdnetes-thesis} .
A következőkben a rendszer által használt technológiákat és elveket csak olyan szinten részletezem,
hogy annak működése érhető legyen.
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
\subsection { Cloud, felhő alapú rendszerek}
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
A cloud lényegében annyit jelent, hogy a szervert, amin az alkalmazás fut, nem a fejlesztőnek kell üzemeltetnie,
hanem valamilyen másik szervezet\footnotemark által vannak karban tartva.
Ez több okból is hasznos:
\begin { itemize}
2020-12-07 23:19:09 +01:00
\item \textbf { Költséghatékonyabb} . Nem szükséges berendezéseket vásárolni, azok üzemeltetési díja nem közvetlen a fejlesztőt éri. Az egyetlen költség a bérlés, ami általában töredéke annak, amit akkor fizetnénk ha magunk csinálnánk az egészet.
2020-11-27 16:54:04 +01:00
\item \textbf { Gyorsabb fejlesztés} . Az alkalmazás futtatására használt szervereket általában a fejlesztő nem látja, ezekkel nem kell foglalkoznia. Ha az alkalmazásnak hirtelen nagyobb erőforrás igénye lesz, a rendszer automatikusan skálázódik.
\item \textbf { Nagyobb megbízhatóság} . Az ilyen szolgáltatást nyújtó szervezeteknek ez az egyik legnagyobb feladata. Az alkalmazás bárhol és bármikor elérhető.
2020-11-27 15:37:25 +01:00
\end { itemize}
\footnotetext { Ilyenek például a Microsoft Azure, az Amazon Web Services vagy a Google Cloud.}
%----------------------------------------------------------------------------
\subsubsection { Mikroszolgáltatások}
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
A mikroszolgáltatások (microservices) nem sok mindenben különböznek egy általános szolgáltatástól.
2020-11-27 15:37:25 +01:00
Ugyan úgy valamilyen kéréseket kiszolgáló egységek, legyen az web kérések kiszolgálása HTTP-n keresztül
vagy akár parancssori utasítások feldolgozása. Az egyetlen fő különbség az a szolgáltatások felelősségköre.
A mikroszolgáltatások fejlesztésénél a fejlesztők elsősorban arra törekednek, hogy egy komponensnek minnél kevesebb feladata és függősége legyen,
ezzel megnő a tesztelhetőség és könyebb a skálázhatóság.
%----------------------------------------------------------------------------
\subsubsection { Konténerek}
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
A konténerek az operációs rendszer virtualizációt megvalósító egyik alkalmazása.
Ezekre különböző korlátozások rakhatók például, hogy a konténer nem látja a teljes fájlrendszert, annak csak egy kijelölt részét,
2020-11-27 15:37:25 +01:00
megadható a konténer által használható processzor és memória igény vagy akár korlátozható az is, hogy a konténer hogyan használhatja a hálózatot.
2020-12-07 23:19:09 +01:00
Léteznek eszközök, például a Docker \cite { docker} , mely lehetővé teszi a fejlesztők számára az ilyen konténerek könnyed létrehozását és futtatását.
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
\subsubsection { Kubernetes}
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
A Kubernetes \cite { kubernetes} a komplex konténerizált mikroszolgáltatás rendszerek menedzselésének könnyítését szolgálja.
2020-11-27 15:37:25 +01:00
Kihasználja és ötvözi az imént említett technológiák előnyeit, hogy egy robosztus rendszert alkosson.
Használatával felgyorsulhat és automatizált lehet az egyes konténerek telepítése, futtatása, de talán a legfőbb előnye,
hogy segítségével könnyedén megoldható a rendszert ért terhelési igények szerinti dinamikus skálázódás.
2020-12-07 23:19:09 +01:00
Azok a mikroszolgáltatások, amikre a rendszernek épp nincs szüksége, minimális erőforrást igényelnek a szerveren,
így nem kell utánnuk annyit fizetni sem. Ezzel ellentétben, ha valamely szolgáltatás után hirtelen megnő az igény,
2020-11-27 15:37:25 +01:00
akkor az könnyedén duplikálható.
%----------------------------------------------------------------------------
\subsection { MQTT}
2020-11-30 16:34:08 +01:00
\label { subsect:mqtt}
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
Az MQTT (Message Queue Telemetry Transport) az egy kliens-szerver publish/subscribe üzenetküldő protokoll. Könnyű implementálni és alacsony a sávszélesség igénye,
mellyel tökéletes jelöltje a Machine to Machine (M2M), illetve az Internet of Things (IoT) kommunikáció megvalósítására.
Működéséhez szükség van egy szerverre, amelynek feladata a beérkező üzenetek továbbküldése témák alapján. Egyes kliensek fel tudnak iratkozni bizonyos témákra, míg más kliensek publikálnak
és a szerver levezényli a két fél között a kommunikációt.
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
\subsection { OpenAPI}
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
Az OpenAPI egy nyilvános alkalmazás-programozási leíró, amely a fejlesztők számára hozzáférést biztosít egy másik alkalmazáshoz.
2020-11-27 15:37:25 +01:00
Az API-k lírják és meghatározzák, hogy egy alkalmazás hogyan kommunikálhat egy másikkal,
melyet használva a fejlesztők könnyedén képesek a kommunikációra képes kódot írni vagy generálni.
%----------------------------------------------------------------------------
\section { Rendszerszintű architektúra}
%----------------------------------------------------------------------------
2020-12-07 23:19:09 +01:00
A Birbnetes fejlesztése során kifejezetten fontos szerepe volt a mikroszolgáltatás alapú rendszerek elvei követésének.
2020-11-27 15:37:25 +01:00
A rendszer egy Kubernetes klaszterben van telepítve és több kisebb komponensből áll, melyek egymás között a HTTP és az MQTT protokollok segítségével kommunikálnak.
2020-12-08 21:12:28 +01:00
A rendszer összes szolgáltatásának van egy OpenAPI leírója, melyet használva hamar volt egy olyan kódbázisom, amely képes volt a rendszerrel való kommunikációra.
2020-11-27 15:37:25 +01:00
2020-11-27 16:44:16 +01:00
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
\subsection { Főbb komponensek}
%----------------------------------------------------------------------------
2020-11-27 16:44:16 +01:00
A \ref { fig:birdnetes-components} -es ábrán láthatóak a rendszer komponensei, melyek mindegyike egy-egy mikroszolgáltatás.
2020-11-27 15:37:25 +01:00
Az egymás mellett lévő kék levélborítékok az MQTT kommunikációt jelölik,
2020-11-27 16:44:16 +01:00
amellyel például a természetben elhelyezett eszközök felé irányuló kommunikáció is történik.
2020-11-27 15:37:25 +01:00
A következő alszakaszokban bemutatom az alkalmazásom szempontjából fontosabb komponenseket.
\begin { figure} [!ht]
\centering
\includegraphics [width=150mm, keepaspectratio] { figures/architecture-redesigned.png}
2020-12-07 23:19:09 +01:00
\caption { A Birbnetes rendszer architektúrája. Forrás: Madárhang azonosító és riasztó felhő-natív rendszer TDK dolgozat \cite { birdnetes-tdk} }
2020-11-27 15:37:25 +01:00
\label { fig:birdnetes-components}
\end { figure}
2020-11-27 16:44:16 +01:00
%----------------------------------------------------------------------------
\subsubsection { IoT eszközök}
%----------------------------------------------------------------------------
Szőlőültetvényekben telepített eszközök, melyek adott időközönként publikálják állapotaikat egyéb metaadatokkal egy üzenetsoron.
Emellett folyamatosan hangfelvételt készítenek a beépített mikrofonjaikkal, mely hangfelvételekről egy másik belső szenzor eldönti,
hogy érdemes-e felküldeni a rendszerbe, ha igen, akkor egy másik üzenetsoron publikálják ezeket a hangfelvételeket.
Tartalmaznak még egy hangszórót is, mely a madarak elijesztését szolgálja.
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
\subsubsection { Input Service}
2020-12-03 16:37:13 +01:00
\label { subsect:birdnetes-input-service}
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
A kihelyezett IoT eszközök által felvett hangfájlok ezen a komponensen keresztül érkeznek be a rendszerbe.
2020-12-07 23:19:09 +01:00
Itt történik a hanganyaghoz tartozó metaadatok lementése az Input Service saját relációs adatbázisába.
2020-11-27 15:37:25 +01:00
Ilyenek például a beküldő eszköz azonosítója, a beérkezés dátuma vagy a hangüzenet rendszerszintű egyedi azonosítója.
Amint a szolgáltatás a berékezett üzenettel kapcsolatban elvégezte az összes feladatát,
2020-12-07 23:19:09 +01:00
publikál egy üzenetet egy másik üzenetsorra a többi kliensnek feldolgozásra.
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
\subsubsection { AI Service}
2020-12-03 16:37:13 +01:00
\label { subsect:birdnetes-ai-service}
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
Az AI Service példányai fogadják az Input Service-től érkező üzeneteket és elkezdik klasszifikálni az abban található hanganyagot.
Meghatározzák, hogy a hanganyag mekkora valószínűséggel volt seregély hang vagy sem.
Ennek eredményét a hangminta egyedi azonosítójával együtt publikálják egy másik üzenetsoron.
%----------------------------------------------------------------------------
\subsubsection { Guard Service}
%----------------------------------------------------------------------------
A Guard Service feliratkozik az AI Service által publikált üzenetek témájára
és valamilyen valószínűségi kritérium alapján eldönti, hogy a hangminta tartalmaz-e seregély hangot.
Ha igen, akkor az üzenetsoron küld egy riasztás parancsot a hanganyagot küldő eszköznek.
%----------------------------------------------------------------------------
\subsubsection { Command and Control Service}
%----------------------------------------------------------------------------
2020-11-27 16:44:16 +01:00
A Command and Control Service az előzőekkel ellentétben egyáltalán nem vesz részt a minták fogadásában, feldolgozásában vagy kezelésében.
2020-11-27 15:37:25 +01:00
Felelősége az eszközök és azok szenzorai állapotának menedzselése és követése.
Ezen keresztül lehet az egyes eszközöket ki- és bekapcsolni.