Write probleme und loesungen

This commit is contained in:
Marcel Schwarz 2020-06-11 01:14:47 +02:00
parent 41b53998de
commit f7c6914f4d

View File

@ -225,7 +225,7 @@
\subsection*{Der "/track" Endpoint} \subsection*{Der "/track" Endpoint}
Beim "/track" Endpoint handelt es sich um einen der wichtigsten Endpoints. Er erlaubt es ein Recording zu erstellen, ohne Angabe des Nutzers. Lediglich der Name des Timetrack Accounts auf den gebucht werden soll muss angegeben werden. Der Endpoint entscheidet auf Serverseite von welchem Nutzer die Anfrage ankam. Dazu wird der Nutzer aus dem JWT extrahiert und abhängig davon im Account des Nutzers geschaut ob schon ein Tracking läuft oder nicht. Sollte noch kein Tracking laufen, wird ein neuer Eintrag mit der aktuellen Zeit erstellt und zurückgeliefert. Das Enddatum ist zu diesem Zeitpunkt noch leer und auch die Duration zeigt "0" an. Sollte schon ein Tracking laufen, wird dieses mit der aktuellen Zeit als Endzeit beendet und ebenfalls zurückgeliefert. Sollte der Account nicht gefunden werden, oder ein anderer Fehler auftreten, wird ein entsprechender HTTP Statuscode zurückgeliefert. Beim "/track" Endpoint handelt es sich um einen der wichtigsten Endpoints. Er erlaubt es ein Recording zu erstellen, ohne Angabe des Nutzers. Lediglich der Name des Timetrack Accounts auf den gebucht werden soll muss angegeben werden. Der Endpoint entscheidet auf Serverseite von welchem Nutzer die Anfrage ankam. Dazu wird der Nutzer aus dem JWT extrahiert und abhängig davon im Account des Nutzers geschaut ob schon ein Tracking läuft oder nicht. Sollte noch kein Tracking laufen, wird ein neuer Eintrag mit der aktuellen Zeit erstellt und zurückgeliefert. Das Enddatum ist zu diesem Zeitpunkt noch leer und auch die Duration zeigt "0" an. Sollte schon ein Tracking laufen, wird dieses mit der aktuellen Zeit als Endzeit beendet und ebenfalls zurückgeliefert. Sollte der Account nicht gefunden werden, oder ein anderer Fehler auftreten, wird ein entsprechender HTTP Statuscode zurückgeliefert.
\begin{lstlisting}[language=json,caption=Aufruf von "/track" ohne und mit laufendem Tracking,label=code:start-tracking-endpoint] \begin{lstlisting}[language=json,caption=Aufruf von "/track" ohne laufendes Tracking,label=code:start-tracking-endpoint]
{ {
"duration": 0, "duration": 0,
"username": "scma", "username": "scma",
@ -234,6 +234,8 @@
"enddate": null, "enddate": null,
"type": "PAID" "type": "PAID"
} }
\end{lstlisting}
\begin{lstlisting}[language=json,caption=Aufruf von "/track" mit laufendem Tracking,label=code:stop-tracking-endpoint]
{ {
"duration": 129, "duration": 129,
"username": "scma", "username": "scma",
@ -256,5 +258,11 @@
Zuletzt gilt es noch zu erwähnen, dass alle Ressourcen Paging und Sorting unterstützen. Paging ist besonders bei Web APIs wichtig, da die Geschwindigkeit sehr stark von der Menge der übertragenen Daten abhängt. Wenn eine Ressource immer alle Daten zurückliefern würde, würde dies bei mehreren hundert Einträgen sicher noch funktionieren. Aber sobald die Zahl der Einträge deutlich höher wird, muss abgeschnitten und aufgeteilt werden. Unsere Standard Seitengröße ist auf 20 Einträge gesetzt. Weiter enthält die Antwort des Servers durch die HAL Integration immer Links zur aktuellen, nächsten und vorherigen Seite als Link. Sorting wird ebenfalls unterstützt. Es kann nach jedem Feld im zurückgegebenen JSON Sortiert werden, auch die Richtung ist spezifizierbar. Zuletzt gilt es noch zu erwähnen, dass alle Ressourcen Paging und Sorting unterstützen. Paging ist besonders bei Web APIs wichtig, da die Geschwindigkeit sehr stark von der Menge der übertragenen Daten abhängt. Wenn eine Ressource immer alle Daten zurückliefern würde, würde dies bei mehreren hundert Einträgen sicher noch funktionieren. Aber sobald die Zahl der Einträge deutlich höher wird, muss abgeschnitten und aufgeteilt werden. Unsere Standard Seitengröße ist auf 20 Einträge gesetzt. Weiter enthält die Antwort des Servers durch die HAL Integration immer Links zur aktuellen, nächsten und vorherigen Seite als Link. Sorting wird ebenfalls unterstützt. Es kann nach jedem Feld im zurückgegebenen JSON Sortiert werden, auch die Richtung ist spezifizierbar.
\section{Probleme und Lösungen} \section{Probleme und Lösungen}
\subsection{Einlesen in Spring}
Spring ist ein sehr komplexes Framework, deshalb war es manchmal wirklich sehr schwierig Fehler zu verstehen und die Gründe dahinter zu verstehen. Solange man sich aber an viele der Best-Practicies von Spring hält ist es überhaupt nicht schwer in relativ kurzer Zeit auch sehr komplexe APIs zu bauen. Durch die enorme Menge an Dokumentation und auch Hilfe aus der Community sowie Techtalks können viele Probleme leicht gelöst werden.
\subsection{Änderungen an den Endpoints}
Es mussten anfangs viele Endpoint immer wieder umdefiniert werden, da sie nicht Best-Practicies entsprochen haben oder nicht performant funktioniert haben. Dies wurde später aber immer einfacher, wenn man sich an die Denkweise einer REST-API gewöhnt hat. Auch zwei Wege Links zwischen Ressourcen waren bei uns nicht möglich, da sie zu Endlosrekursionen führten. Später wurde aber auch klar, das dies überhaupt nicht gewünscht ist.
\subsection{Probleme mit MariaDB}
Zu beginn haben wir für das Docker-Image der Datenbank den "latest"-Tag benutzt. Dies war möglich, da wir keinerlei eigene Konfiguration der Datenbank und deren Tabellen vorgenommen haben. Allerdings wurde mitte April die neue LTS-Version von Ubuntu veröffentlicht und damit auch das Basisimage von MariaDB angepasst. Durch Änderungen in Ubuntu 20.04 funktionierten nun gewisse Datenbankfunktionen nicht mehr ordnungsgemäß. Als Lösung kam dann nur ein Downgrade auf eine ältere Version in frage.
\section{Deployment} \section{Deployment}
Das Deployment des Backends findet immer gleichzeitig mit der Datenbank und dem Frontend statt. Die Daten bleiben dabei erhalten und werden, so fern nötig, von Spring automatisch migriert. Auch beim hinzufügen oder entfernen von Feldern aus Entitäten aktualisiert Spring die Datenbanktabellen entsprechend den neuen Feldern. Sollten Felder wegfallen werden diese einfach gelöscht, kommen neue hinzu wird entweder der Defaultwert gesetzt oder, wenn erlaubt, "Null". Das Deployment des Backends findet immer gleichzeitig mit der Datenbank und dem Frontend statt. Die Daten bleiben dabei erhalten und werden, so fern nötig, von Spring automatisch migriert. Auch beim hinzufügen oder entfernen von Feldern aus Entitäten aktualisiert Spring die Datenbanktabellen entsprechend den neuen Feldern. Sollten Felder wegfallen werden diese einfach gelöscht, kommen neue hinzu wird entweder der Defaultwert gesetzt oder, wenn erlaubt, "Null".