...
Klas | ITA-OOSE-A |
---|---|
Groepsnaam | Smalltalk |
Course | OOSE |
Datum |
|
Versie | 1.19 |
Inhoudsopgave
Table of Contents |
---|
Inleiding
Het bedrijf Regterschot Racing wil een website applicatie hebben waarop de data die van de sensoren in de auto verzamelen in te kunnen zien is. Regterschot Racing verwacht in ieder geval van één sensor, de GPS, twintig keer per seconde data te krijgen. Het is voor Regterschot Racing niet alleen belangrijk dat deze data goed overkomt van vanaf de auto naar de website applicatie maar ook en dat deze data dit zo snel mogelijk, het liefst in real-time, overkomt. Het is voor ons van belang om een dit onderzoek uit te voeren om op deze manier zo te weten te komen wat een techniek is om zo goed mogelijk aan te sluiten welke techniek het beste aansluit bij de wensen van Regterschot Racing. Iets waar we ook rekening mee moeten houden is dat de Raspberry Pi de data in ieder geval opslaat in een MySQL database. Dit proces loopt via een message broker. Een message broker is een soort van tussenpersoon bij twee of meer applicaties. Het is mogelijk om van applicatie A een bericht te sturen naar applicatie B. Ook kunnen applicatie A en C berichten sturen naar alleen applicatie B, of juist alleen applicatie A naar B en D. Eén van de voordelen die een message broker heeft is dat berichten altijd aankomen. Een bericht wordt verstuurd en pas als er een response komt wordt het bericht uit de queue van de broker verwijderd. Als de broker geen response krijgt wordt het bericht nogmaals verstuurd totdat dit succesvol is. Het hebben van een queue is handig voor het hebben van een first in first out ordering, maar ook het bewaren van berichten voor als een server niet bereikbaar is.
Na het onderzoek zal er in ieder geval een prototype van de broker, en de gevonden oplossing voor het overbrengen van de data. Dit prototype zal een basis zijn voor de rest van de applicatie. Het prototype van de broker is eigenlijk alleen bedoelt om een klein beetje bekender te geraken met de techniek van een broker. De ESE studenten zullen namelijk de broker zelf opzetten, waar wij alleen de data vanuit deze broker nodig gaan hebben.
Hoofd- en deelvragen
Onze Mijn hoofdvraag is: 'Welke technieken bestaan er techniek kunnen wij gebruiken om real-time data weer te geven op een website?' Om deze deze vraag te kunnen beantwoorden hebben we , heb ik ook een aantal deelvragen opgezet. Onze Mijn eerste twee deelvragen gaan over de technieken die bekend zijn, of veel gebruikt worden om de data , voor het weergeven van data in real-time weer te geven op een website. Deze deelvraag is opgesplitst in welke technieken er zijn die gebruik maken van een MySQL database , en technieken die geen gebruik maken van deze database. Ook zal er bij Bij de tweede deelvraag zal er gekeken worden naar technieken die überhaupt geen gebruik maken van een database. Daarna zullen we kijken of we kunnen vinden welke technieken er wordt gebruikt in autoraces. Bij deelvraag 3 zal er gekeken worden naar welke technieken voor het streamen van data naar de pit er in autoraces worden toegepast. Een voorbeeld hiervan kan zijn: 'Welke techniek wordt er bijvoorbeeld gebruikt bij F1 races om de data van de baan naar de pit te sturen?' In de vierde deelvraag zullen we opgaan in zal ik ingaan op de voordelen voor- en nadelen van de bovengenoemde technieken. In het kort hebben we heb ik de volgende deelvragen:
- Welke technieken, die veel gebruikt worden of ons bekend zijn, maken gebruik van een MySQL database?
- Welke technieken, die veel gebruikt worden of ons bekend zijn, maken geen gebruik van een database of andere database?
- Welke technieken worden bij autoraces gebruikt om de data van de auto naar een pit te krijgen?
- Wat zijn de een aantal voor- en nadelen van de verschillende technieken voor het weergeven van real-time data?
...
Welke technieken, die veel gebruikt worden of ons bekend zijn, maken
...
gebruik van een MySQL database?
...
Script dat elke x seconden data ophaalt
Een van de manieren om data op te halen uit een database is door elke x seconden een request uit te laten voeren. Je kan bijvoorbeeld alle data ophalen na een bepaald tijdstip en de rest van de data, die je in dit geval al hebt, achterwege laten. In dit geval zal je een timer of iets dergelijks moeten hebben die elk keer de data ophaalt en deze op de applicatie toont.
Gebruik van transactielogboek
...
In het artikel van Herrera geeft hij allereerst drie verschillende mogelijkheden weer voordat hij, in dit geval de derde, techniek kiest en deze ook uitwerkt. De drie technieken die hij benoemt zijn:
- Poll the database every X seconds and determine if something has changed using a timestamp, version number or status field.
- Use database or application-level triggers to execute a piece of code when something changes.
- Use the database transaction/replication log, which records every change to the database. (Herrera, 2018)
Herrera kiest hier voor de derde optie, omdat hij vindt dat deze het meest robuust is. Ook benoemd hij dat deze techniek geen middelen verspilt door bijvoorbeeld polling of het proces vertraagd door bijvoorbeeld het gebruik van triggers. Een trigger is een stuk code dat in de database luistert naar een insert, update of delete. Vaak wordt dit gebruikt om in de database een aanpassing te doen of om een stukje van de code te valideren. Een trigger kan echter ook gebruikt worden om een stukje code uit te voeren, al is dit zoals Herrera zegt proccess vertragend.
Herrera geeft de volgende afbeelding met hoe het systeem uiteindelijk zal werken.
Figuur 1 (Herrera, 2018)
Als er een insert, update of delete op de MySQL database wordt uitgevoerd, wordt dit in een Binary binary log gezet. De Java applicatie luistert naar deze binary log met gebruik van de mysql-binlog-connector-java. Nadat de Java applicatie deze data heeft ontvangen, wordt deze omgezet zodat alleen de relevante data door wordt gestuurd naar de "Pusher Channel". Vervolgens gebruikt Herrera een React app die verbonden is aan de pusher. De pusher zit als een soort API tussen de React app en de Java backend.
Welke technieken die veel gebruikt worden of ons bekend zijn maken geen gebruik van een MySQL database?
Polling
Regterschot Racing gebruikt een API om de data van de Raspberry Pi in de database te zetten. De client, in dit geval onze Java web applicatie, kan een request sturen naar deze API. Als de API nieuwe data heeft, dan zal hij deze teruggeven aan de applicatie. Als deze geen nieuwe data heeft, dan krijgt de applicatie een bericht terug dat er geen nieuwe data is. Het is vergelijkbaar met het verversen van je email om te kijken of er nieuwe email is.
Figuur 2 (Veen, 2012)
Long polling
Long polling lijkt op polling, al is er 1 verschil. De client stuurt ook in dit geval een request naar de server, in dit geval de API van Regterschot Racing. De server krijgt deze request binnen maar stuurt niet gelijk een response terug. De server wacht echter tot hij nieuwe info heeft. Op het moment dat dat zo is stuurt hij deze info terug aan de client. De client stuurt op dat moment gelijk weer een nieuwe request.
Figuur 3 (Veen, 2012)
Server-sent events (SSE)
Bij SSE stuurt de client een request naar een server. De server opent dan een connectie tussen de twee. De server stuurt niks terug tot het moment dat deze nieuwe data krijgt. Op het moment dat deze nieuwe data krijgt stuurt hij deze naar de client. De connectie wordt echter niet gesloten en blijft dus bestaan. Dit zorgt ervoor dat de client niet opnieuw een request hoeft te sturen, maar gewoon kan wachten op de nieuwe data van de server.
Figuur 4 (Veen, 2012)
WebSocket
Een WebSocket lijkt veel op SSE. Een WebSocket is te vergelijken met bijvoorbeeld WhatsApp. Bij SSE wordt er een connectie geopend en kan de server ten alle tijde data sturen naar de client. Bij een WebSocket kan dit ook, echter kan ook de client nieuwe data sturen naar de server, wat niet mogelijk is bij SSE.
Figuur 5 (Veen, 2012)
Welke techniek wordt er bij autoraces gebruikt om de data van de auto naar een pit te krijgen?
Data via radiosignalen
De sensoren die in een F1 raceauto zitten zijn veelal met elkaar verbonden. Elke auto heeft zijn eigen netwerk en de data wordt van punt één naar punt twéé verzonden. Uiteindelijk komt alle data binnen op een server die nog in de auto zelf zit. De data wordt op dat moment geëncrypt en verzonden naar de pit met gebruik van radio signalen. Op een race circuit staan meerdere palen die de radiosignalen op kunnen pikken en weer kunnen versturen. De palen staan op zo'n manier ingedeeld dat als een coureur niet meer in het bereik is van paal A, hij wel in het bereik is van paal B.
Bij NASCAR wordt de data ook opgeslagen via een transducer door radiosignalen die verstuurd worden naar een centrale computer. Data bij NASCAR wordt echter veelal gebruikt om bijvoorbeeld de afstand tussen auto's aan te geven of hoe snel een auto momenteel rijdt. De data die tijdens een race binnenkomt wordt alleen naar NASCAR medewerkers verstuurd.
Wat zijn een aantal voor- en nadelen van de verschillende technieken voor het weergeven van real-time data?
Script dat elke x seconden data ophaalt
Bij een script dat elke minuut runt voor een paar regels zijn er geen problemen. Bij een seconde moeten we al gaan kijken of het elke keer volledig binnenkomt. Als we de data twintig keer per seconden op de website willen tonen, moeten we het script elke 50ms laten runnen. Als we deze keuze maken moeten er een aantal dingen bijkomen. Allereerst komt de data op de database binnen, dan moeten we een script hebben dat alleen die data ophaalt en geen andere data. Er zal dus moeten worden gekeken op ID of op tijd/timestamp. Ook deze data, de id of tijd die als laatste bekend is, moet ergens worden opgeslagen of onthouden worden door het systeem. Het kan ook nog zo zijn dat op het moment van ophalen het net iets langer duurt en er al andere data in te komen is staan en je dus achterloopt of data overslaat. Tien regels in een tabel zal binnen een milliseconde verwerkt worden (afhangend van de hardware), maar miljoenen regels in honderden tabellen loopt al snel op. Dit zijn dingen die makkelijker zijn te voorkomen en te verwerken met gebruik van andere technieken. Het voordeel dat dit systeem heeft is dat het snel en makkelijk te implementeren is en wij allemaal de benodigdheden hebben om dit te doen. Een verbetering zou kunnen zijn om een stuk code te laten uitvoeren op het moment dat er een insert is op een tabel, die de data ophaalt. Dit zal ook effect hebben op de snelheid van het systeem.
Gebruik van transactielogboek
De techniek van Herrera, dat gebruik maakt van het transactielogboek, is een techniek die alles al meer direct doet. De data wordt opgeslagen en de Java applicatie weet dat gelijk. Via de pusher channel staat het bijna direct op de website. Een van de voordelen dat deze techniek heeft, is dat er nooit data op wordt gehaald als deze niet wordt opgeslagen. Herrera geeft zelf al aan dat het systeem dat hij gebruikt het proces niet vertraagd wordt door triggers. Zo snel als er een update is in de database, weet ook de Java API dit. Vervolgens kan de API dit aan de pusher doorgeven die het dan weer op de website zet. Al deze stappen lijken misschien meer dan het ophalen van data maar is al een stuk efficiënter en sneller. Het gebruikt meerdere elementen die ook los van elkaar bestaan. Zo lijkt het ophalen van data enigszins op long polling (wachten tot er data is in plaats van vragen of het er al is).
Polling
Polling lijkt op de eerste techniek, een script dat elke x aantal seconden data ophaalt. Er wordt een request verstuurd met, in dit geval, de vraag of er al data binnen is gekomen. De server (DB/API) zal reageren met of de opgevraagde data, of dat er geen nieuwe data is. Als de client de reactie heeft, ongeacht van wat deze reactie is, dan zal de client direct weer een nieuwe aanvraag sturen. Dit is een systeem dat sneller zal werken dan een script dat elke keer aangeroepen wordt, maar zal door de snelheid (als een request sneller verwerkt wordt dan het eerder aangegeven script) ook meer resources in gebruik nemen.
Long polling
Long polling is een soort van opvolger en in dit geval een betere opvolger van polling. Long polling begint op dezelfde manier. Er wordt een request gestuurd naar de server vanaf de client. Hier is ook gelijk al te zien wat er beter is aan long polling ten opzichte van 'gewoon' polling. Bij polling wordt er een response gestuurd. Deze response is zo snel mogelijk, dus of met data, of er is geen nieuwe data. Long polling wacht tot er nieuwe data is. Is er nog geen data, dan ook geen response. Is er wel nieuwe data, dan krijg je ook de response. Zo snel als de response binnenkomt wordt er ook weer een nieuwe request gestuurd ,zodat de mogelijk nieuwe data weer zo snel mogelijk binnenkomt. Bij long polling is het echter wel zo dat een server of client soms denkt dat de connection te lang open heeft gestaan en dat deze connection na een tijd gesloten wordt. Het gebruikt meer resources dan een WebSocket. Ook kan het zijn dat er meerdere poll requests open staan naar een server en de volgorde van de berichten niet klopt.
Server-sent events WebSockets
Server-sent events en WebSockets lijken veel op elkaar, ook is er in dit geval één kopje voor de twee samen. Een aantal verschillen tussen de twee, is dat SSE over HTTP gebruikt kan worden, terwijl WebSockets hun eigen protocol hebben. Een groot verschil tussen deze data transfer technieken, is wie requests en responses kan sturen. Bij SSE wordt er één keer een request gestuurd naar de server. Deze request is een aanvraag om te verbinden. Daarna kan alleen de server berichten terug sturen. De client kan geen berichten naar de server sturen. Dit is ook waar SSE voor gemaakt is. WebSockets die wel berichten kunnen sturen naar de server als er eenmaal een connectie is geopend zijn overbodig. Daarnaast zijn er andere voor- en nadelen te benoemen, zoals dat SSE maar een maximum aantal van open connecties mag hebben. Een makkelijke oplossing voor dit probleem is het gebruik van meerdere host names. In plaats van www.example.com kan je ook www1.example.com en www2.example.com gebruiken.
Conclusie
...
'Welke techniek kunnen wij gebruiken om real-time data weer te geven op een website?' Is mijn hoofdvraag. Tijdens dit onderzoek heb ik verschillende deelvragen beantwoord om op deze vraag een antwoord weten te bedenken. Hieronder een samenvatting van mijn bevindingen en de uiteindelijke techniek die wij willen gaan gebruiken.
Als we los kijken naar alle systemen, dan zijn er twee die uitspringen. Dit zijn de server-side events en WebSockets. Deze twee bijna identieke technieken zijn de technieken die mij het best lijken. Een WebSocket en een server-side event service zijn de twee keuzes die het meest real time data weergeven, zonder dat deze technieken extra middelen gebruiken
Omdat er gebruik wordt gemaakt van een message broker, is mijn oplossing niet afhankelijk van de rest van de andere systemen. Wij zouden met een WebSocket de data van de broker kunnen 'consumeren'. De broker krijgt de data van de Raspberry Pi en zal deze distribueren naar verschillende consumers, in dit geval de WebSocket en database. De WebSocket zou in dit geval de data in de juiste vorm kunnen gieten voor de website. Dit zou ervoor zorgen dat de data die op de website binnenkomt gelijk kan worden omgezet naar de visuele weergaves. Omdat de broker ook gelijk de data naar de database stuurt, kunnen we later deze gebruiken om de data te tonen van vorige races. Het kan zo zijn dat als we vanuit de database een berekening willen maken, er een gebruiker wordt aangemaakt op de website. Het is mogelijk dat dit ook weer via de broker moet (omdat het niet naar de database moet maar ook naar een andere harde schijf die ergens ligt). Om deze reden kiezen wij er bewust voor om een WebSocket te gaan gebruiken in combinatie met een message broker en niet een server-side events service.
Bronnenlijst
Herrera, E. (2018, 4 mei). Getting data in realtime from MySQL with Java. Pusher. https://pusher.com/tutorials/realtime-mysql-java/
Kilbride-Singh, K. (2022, 17 oktober). WebSockets vs Long Polling. Ably. https://ably.com/blog/WebSockets-vs-long-polling
Pure Storage. (2021, 20 december). How Formula 1 Car Sensors Create Data at Every Turn. https://blog.purestorage.com/perspectives/how-formula-1-car-sensors-create-data-at-every-turn/
Veen, T. [Tieme] Van. (2012, 12 oktober). What are Long-Polling, WebSockets, Server-Sent Events (SSE) and Comet? Stack Overflow. https://stackoverflow.com/questions/11077857/what-are-long-polling-WebSockets-server-sent-events-sse-and-comet