SyncEngine
SyncEngine ist die zentrale Komponente der Offline-Architektur von tikento. Sie ist verantwortlich fuer:
- Speicherung von Aenderungen in der lokalen Datenbank (IndexedDB ueber Dexie.js)
- Verfolgung von Aenderungen, die auf Synchronisierung warten (
pendingSync=true) - Senden von Aenderungen an den Server bei Wiederherstellung der Verbindung
- Empfangen von Updates vom Server (Delta Sync)
- Deduplizierung zur Vermeidung von Duplikaten
Lebenszyklus einer Aenderung
1. Erstellung einer Aenderung
Wenn Sie eine Aktion ausfuehren (z. B. Check-in eines Teilnehmers), fuehrt SyncEngine folgende Schritte aus:
- Schreibt die Aenderung in IndexedDB mit dem Flag
pendingSync=true - Weist den Zeitstempel
clientTszu (aktuelle Uhrzeit auf dem Geraet) - Erhoeht den Zaehler ausstehender Aenderungen im Indikator
- Zeigt die Aenderung sofort in der Benutzeroberflaeche an (optimistisches Update)
2. Senden an den Server
Bei bestehender Verbindung fuehrt SyncEngine folgende Schritte aus:
- Extrahiert alle Datensaetze mit
pendingSync=true - Sortiert sie nach
clientTs(von alt nach neu) - Sendet sie als Paket an den Server
- Wartet auf Bestaetigung vom Server
3. Bestaetigung
Nach erfolgreicher Serverantwort:
- Das Flag
pendingSyncwird fuer jeden gesendeten Datensatz entfernt (false) - Der Zaehler ausstehender Aenderungen wird reduziert
- Wenn alle Aenderungen gesendet wurden, wechselt der Indikator auf gruen
4. Fehlerbehandlung
Bei einem Sendefehler:
- Die Aenderungen behalten
pendingSync=true - Ein erneuter Versuch erfolgt nach 30 Sekunden
- Maximal 5 Versuche, danach wird der Benutzer benachrichtigt
Delta Sync
Delta Sync ermoeglicht es, vom Server nur die Daten abzurufen, die sich seit der letzten Synchronisierung geaendert haben, anstatt den gesamten Datenbestand herunterzuladen.
So funktioniert es
- SyncEngine speichert den Zeitstempel der letzten erfolgreichen Synchronisierung in der Tabelle
meta. - Bei der Synchronisierung wird eine Anfrage mit dem Parameter
sincegesendet:
GET /sync/delta?since=2026-07-15T10:30:00Z&entities=registrations,payments
- Der Server gibt nur Datensaetze zurueck, die nach dem angegebenen Zeitpunkt geaendert wurden.
- SyncEngine aktualisiert die lokale Datenbank und speichert den neuen Zeitstempel.
Anfrageparameter
| Parameter | Beschreibung |
|---|---|
since | ISO 8601 Zeitstempel der letzten erfolgreichen Synchronisierung |
entities | Kommagetrennte Liste von Entitaetstypen: registrations, payments, events |
Vorteile
- Datenverkehr sparen. Es werden nur Aenderungen uebertragen, nicht alle Daten
- Schnelligkeit. Die Synchronisierung dauert Sekunden statt Minuten
- Zuverlaessigkeit. Wenn die Synchronisierung unterbrochen wird, beginnt der naechste Versuch mit dem gleichen
since
Automatische Synchronisierung
SyncEngine ueberwacht den Netzwerkstatus und startet die Synchronisierung automatisch in folgenden Faellen:
Bei Wiederherstellung der Verbindung
Wenn das Geraet von offline auf online wechselt:
- Das
online-Ereignis wird erkannt (Network Information API) - SyncEngine prueft die Serververfuegbarkeit (Ping)
- Ausstehende Aenderungen werden gesendet (Upload)
- Updates werden vom Server abgefragt (Download via Delta Sync)
Periodische Synchronisierung
Im Online-Modus prueft SyncEngine regelmaessig auf Server-Updates, damit die Daten aktuell bleiben (z. B. wenn ein anderes Teammitglied einen Check-in von einem anderen Geraet durchgefuehrt hat).
Deduplizierung
Zur Vermeidung von doppelten Aenderungen wird ein zusammengesetzter Schluessel verwendet:
clientTs + userId
Jede Aenderung wird eindeutig durch die Kombination aus Client-Zeitstempel und Benutzer-ID identifiziert. Wenn dieselbe Aenderung erneut gesendet wird (z. B. aufgrund eines Netzwerk-Timeouts), erkennt der Server das Duplikat anhand dieses Schluessels und gibt eine Bestaetigung zurueck, ohne die Aenderung erneut anzuwenden.
Das garantiert Idempotenz -- das erneute Senden desselben Aenderungspakets fuehrt nicht zu Fehlern oder Datenduplizierung.
Synchronisierungsreihenfolge
Aenderungen werden streng in chronologischer Reihenfolge nach clientTs gesendet. Das ist entscheidend fuer die Korrektheit:
- Ein Check-in eines Teilnehmers um 10:05 kann nicht durch eine Check-in-Stornierung um 10:03 ueberschrieben werden
- Eine manuelle Zahlungsbestaetigung um 11:00 wird nach der Statusaenderung um 10:55 angewendet
Wenn die Geraeteuhr von der Serverzeit abweicht, kompensiert SyncEngine die Differenz bei der ersten erfolgreichen Synchronisierung.
Umfang des lokalen Speichers
Die lokale IndexedDB-Datenbank hat Beschraenkungen, die vom Browser und Geraet abhaengen:
| Plattform | Typisches Limit |
|---|---|
| Chrome / Edge | Bis zu 80% des freien Speicherplatzes |
| Safari | Bis zu 1 GB |
| Firefox | Bis zu 2 GB |
Fuer eine typische Veranstaltung (bis zu 2.000 Teilnehmer) betraegt das Datenvolumen 5-20 MB, was weit unter den Limits jedes Browsers liegt.
Bei Annaeherung an das Speicherlimit zeigt SyncEngine eine Warnung an und schlaegt vor, Daten abgeschlossener Veranstaltungen zu bereinigen.