Offline App - Handling fehlgeschlagener / abgebrochener Datensynchronisation

  • Allgemein

    Offline App - Handling fehlgeschlagener / abgebrochener Datensynchronisation

    Hallo zusammen,

    ich habe mal eine Frage in die Runde. Wir arbeiten zurzeit in einem kleinen Team an einer iOs / Android App auf Basis von Xamarin.Froms. Einsatzzweck dieser App ist im Bereich des Vertriebs-Außendiensts. Das heißt, ein Außendienstmitarbeiter besucht Märkte / Standorte, macht dort verschiedene Dinge und reportet das ganze über die App. Dabei ist es extrem wichtig das die App immer funktioniert, also auch wenn keine Internetverbindung besteht.

    Als Backend haben wir uns daher für Microsoft Azure App Services entschieden. Azure bietet eben genau diese Offline-Synchronisation. Alle Daten liegen lokal und werden bei bestehender Internetverbindung mit dem Server synchronisiert. Die Datenhaltung auf dem Server geschieht über einen SQL Server 2016 und auf dem Endgerät wird SQLLite verwendet. Der Datenabgleich muss explizit vom Anwender gestartet werden, hierfür gibt es einen Button in der App.

    Die Problemstellung:

    Jede Tabelle wird einzeln beim Server angefragt und heruntergeladen. In der Regel kann eine Tabelle auch nicht komplett auf einmal heruntergeladen werden weil es zu viele Daten sind. Pro Tabelle können auch mehrere Zugriffe auf den Server notwendig sein.

    Azure App Services bietet keine Möglichkeit diese Anfragen in einer Transaktion zu bündeln und gegebenenfalls einen Rollback auszuführen. Bricht der Datenabgleich (wieso auch immer) mittendrin ab kann es passieren das der Datenbestand auf dem Endgerät inkonsistent ist und die App daher nicht verwendet werden kann. Die Datenbankstruktur ist recht komplex und der Normalisierungs-Grad der Datenbank recht hoch, was bedeutet das es viele Abhängigkeiten zwischen den Tabellen gibt und nicht einfach alle zusammengehörige Daten in einer Tabelle stehen. Wenn z.B Tabelle A erfolgreich heruntergeladen wird aber Tabelle B nicht, können Daten aus Tabelle A nicht verwendet werden weil eben unvollständig.

    Unsere Lösungsansätze:

    1. Läuft die Datensynchronisation nicht erfolgreich bis zum Ende durch wird die App gesperrt und der Anwender wird dazu aufgefordert die Datensynchronisation zu wiederholen bis sie erfolgreich war.

    Bewertung: Das ist eigentlich ein Nogo. Nehmen wir an, der Außendienstmitarbeiter steht vor dem Markt und raucht gerade noch eine und denkt sich das er in dieser Zeit doch kurz mal einen Datenabgleich ausführen könnte. Dieser bricht aber ständig aufgrund der schlechten Internetverbindung ab. Jetzt steht der Außendienstmitarbeiter im Markt und kann die App nicht verwenden weil diese gesperrt ist.

    2. Wir bauen eine Logik in die App ein welche prüft ob ein Datensatz verwendet werden kann. Soll z.B auf einen Datensatz in Tabelle A zugegriffen werden muss zu nächst geprüft werden ob die passenden Relations in Tabelle B, C, D, E, F und G vorhanden sind. Wahrscheinlich müssen hierzu auch "Checksums" in der Serverdatenbank hinterlegt werden. Es gibt z.B die Möglichkeit in der App einen Fragebogen auszufüllen. Das macht aber nur Sinn wenn dieser auch vollständig heruntergeladen wurde. Also muss auch irgendwo hinterlegt sein was der Fragebogen alles beinhaltet. Außerdem muss natürlich bei JEDEM Objektzugriff überprüft werden ob irgendetwas Null ist damit es zu keinem Fehler kommt.

    Bewertung: Ich denke es ist ersichtlich das sowas recht kompliziert ist und daher fehleranfällig. Für jeden Datentyp müssen individuelle Prüfroutinen geschrieben werden da sich diese nicht verallgemeinern lassen. Außerdem ist es sehr wahrscheinlich das hier schnell mal was übersehen wird und dann kommt es am Ende doch wieder zu einem Fehler in der App. Um hier keinen Fehler zu machen ist es sehr wichtig den Code gut zu kennen und vor allem die Datenbankstruktur, was die Einarbeitung neuer Programmierer in dieses Projekt zu einer sehr großen Herausforderung werden lässt.

    Jetzt würde ich gerne euch fragen ob ihr eine Idee habt wie man so etwas handeln kann. Ich denke das die Problemstellung von der verwendeten Technik losgelöst ist und es sich mehr um eine generelle Softwaredesign - Frage handelt. Wie würdet ihr an dieses Problem heran gehen?

    Wir freuen uns über jeden Input zu diesem Thema. Vielen Dank :)

    Die Farbe "Rot" (#FF0000) gehört der Moderation. => Farbmarkierung entfernt. ~Trade

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Trade“ ()