Behandle die App als : Jedes Gerät ist eine lokale . Lernaktionen werden in eine plus ein append-only (Outbox) geschrieben; beim Reconnect und seit dem letzten Sync. Konflikte werden durch eine einzige globale Regel gelöst, sondern durch die .
Behandle die App als : Jedes Gerät ist eine lokale . Lernaktionen werden in eine plus ein append-only (Outbox) geschrieben; beim Reconnect und seit dem letzten Sync. Konflikte werden durch eine einzige globale Regel gelöst, sondern durch die .
Mentales Modell: Stell es dir wie git vor — jedes Gerät "committet" offline lokal, und Sync ist ein Merge, kein Überschreiben.
Device (offline) Server = source of truth
┌──────────────────┐ on reconnect ┌───────────────────────────┐
│ Local DB (SQLite)│ push ops (delta) │ Sync API /sync │
│ + Op log (outbox)│ ─────────────────▶ │ • idempotent by op.id │
│ cursor = lastSeen│ ◀───────────────── │ • merge by semantics │
└──────────────────┘ pull changes>cursor└───────────────────────────┘
Progress DB (Postgres)
Handy-Uhren sind unzuverlässig und zwei Geräte können denselben Datensatz offline bearbeiten, daher verliert "last write wins" (LWW) still und heimlich Daten. Löse nach Semantik auf:
// op hat eine id -> idempotent anwenden (Retries zählen nicht doppelt). clientTs wird NICHT vertraut.
function mergeProgress(server, op) {
return {
// progress steigt nur -> max: eine späte alte Op zieht ihn nie zurück
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs ist ein additiver Zähler -> addiere das Delta, überschreibe nicht
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Hier würde reines LWW ein veraltetes Gerät, das spät mit progress: 0.3 synct, die 0.9 des Servers überschreiben lassen → verlorener Fortschritt. Das max zu nehmen und studiedMs zu summieren macht den Sync reihenfolge-unabhängig — sicher, wenn Millionen von Geräten mit verzerrten Uhren synchronisieren.
Der Interviewer prüft, ob du weißt, dass Client-Uhren nicht vertrauenswürdig sind (also kein reines Timestamp-LWW), ob du Sync idempotent machst (Op-ids) und ob du nach Datenbedeutung merged. Eine schwache Antwort: "Timestamps verwenden, last write wins." Eine starke Antwort: Replica + Op-Log + Idempotenz + Per-Field-Merge + Server als source of truth — und LWWs Datenverlust-Fehler explizit benennen.
LWW ist günstig, aber verlustbehaftet; semantischer Merge braucht Überlegung pro Feld, verliert aber nichts. Greife nur dann zu vollem CRDT/OT, wenn du echtes kollaboratives Editieren brauchst (Notizen, Dokumente) — es ist teuer, also nutze es nicht für alles.
Eine Sammlung von IT-Interviewfragen mit ausführlichen Antworten — vom Junior bis zum Senior.
Spenden