2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
2020-11-28 17:38:33 +01:00
\chapter { A Birdnetes bemutatása}
2020-11-27 15:37:25 +01:00
\label { chapt:birdnetes-introduction}
%----------------------------------------------------------------------------
2020-11-27 16:44:16 +01:00
Ebben a fejezetben ismertetem a Birdnetes 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.
%----------------------------------------------------------------------------
\section { Gyors elméleti összefoglaló}
%----------------------------------------------------------------------------
Ez a szakasz nem azt a célt szolgálja, hogy minnél részletesebb képet mutasson az itt leírt technológiákról.
2020-11-28 17:38:33 +01:00
Arra sokkal jobb eszköz Pünkösdi Marcellnek és Torma Kristófnak, a Birdnetes alkótóinak TDK dolgozata\cite { birdnetes-tdk} .
2020-11-27 15:37:25 +01:00
Ez csupán egy rövid összefoglaló a Birdnetes működésének megértése szempontjából elengedhetetlen technológiákról és elvekről,
2020-11-28 17:38:33 +01:00
hogy valamennyire érthetőbbek legyenek a fejezetben elhangzó kifejezések.
2020-11-27 15:37:25 +01:00
%----------------------------------------------------------------------------
\subsection { Cloud, felhő}
%----------------------------------------------------------------------------
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-11-27 16:54:04 +01:00
\item \textbf { Olcsóbb} . Nem kell berendezéseket vásárolni, nincs üzemeltetési díj. 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.
\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}
%----------------------------------------------------------------------------
A mikroszolgáltatások nem sok mindenben különböznek egy általános szolgáltatástól.
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}
%----------------------------------------------------------------------------
A konténer technikailag semmivel sem több mint egy Linux-on futó processz amelyre különböző korlátozásokat szabtak.
Ilyen korlátozások lehetnek például, hogy a konténer nem látja a teljes fájlrendszert, annak csak egy kijelölt részét,
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-11-28 17:38:33 +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-11-28 17:38:33 +01:00
A Kubernetes\cite { kubernetes} az ilyen 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.
Azok a mikroszolgáltatások, amikre a rendszernek épp nincs szüksége, nem futnak, nem igényelnek erőforrást a szerveren,
így nem kell utánnuk fizetni sem. Ezzel ellentétben, ha valamely szolgáltatás után hirtelen megnő az igény,
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.
%----------------------------------------------------------------------------
\subsection { Open API}
%----------------------------------------------------------------------------
Az Open API 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.
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}
%----------------------------------------------------------------------------
A Birdnetes fejlesztése során kifejezetten fontos szerepe volt a mikroszolgáltatás alapú rendszerek elvei követésének.
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.
A rendszer összes szolgáltatásának van egy Open API 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 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}
\caption { A Birdnetes rendszer architektúrája}
\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.
Itt történik a hanganyaghoz tartozó metaadatok lementése az Input Service saját adatbázisába.
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,
publikál egy üzenetet az MQTT üzenetsorra a többi kliensnek feldolgozásra.
%----------------------------------------------------------------------------
\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.