Behandel de app als : elk device is een lokale . Studie-acties worden weggeschreven naar een plus een append-only (outbox); bij herverbinding het device en sinds de laatste sync. Conflicten worden opgelost met één globale regel, maar door de .
Behandel de app als : elk device is een lokale . Studie-acties worden weggeschreven naar een plus een append-only (outbox); bij herverbinding het device en sinds de laatste sync. Conflicten worden opgelost met één globale regel, maar door de .
Mentaal model: zie het als git — elk device "commit" lokaal terwijl het offline is, en sync is een merge, geen overwrite.
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)
Telefoonklokken zijn onbetrouwbaar en twee devices kunnen hetzelfde record offline bewerken, dus "last write wins" (LWW) verliest stilletjes data. Los op via semantiek:
// op heeft een id -> pas idempotent toe (retries tellen niet dubbel). clientTs wordt NIET vertrouwd.
function mergeProgress(server, op) {
return {
// progress neemt alleen toe -> max: een late oude op sleept het nooit terug
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs is een additieve teller -> tel de delta op, niet overschrijven
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Hier zou pure LWW een verouderd device dat laat synct met progress: 0.3 de 0.9 van de server laten overschrijven → verloren voortgang. Het nemen van max en het optellen van studiedMs maakt sync volgorde-onafhankelijk — veilig wanneer miljoenen devices synchroniseren met scheve klokken.
De interviewer peilt of je weet dat client-klokken niet te vertrouwen zijn (dus geen pure timestamp-LWW), of je sync idempotent maakt (op-ids), en of je merget op basis van databetekenis. Een zwak antwoord: "gebruik timestamps, last write wins." Een sterk antwoord: replica + op log + idempotency + merge per veld + server als source of truth — en expliciet de dataverlies-faalmodus van LWW benoemen.
LWW is goedkoop maar verliesbaar; semantische merge vereist denkwerk per veld maar verliest niets. Grijp pas naar volledige CRDT/OT wanneer je echte collaboratieve bewerking nodig hebt (notities, documenten) — het is kostbaar, dus gebruik het niet voor alles.
Een bibliotheek met IT-sollicitatievragen met gedetailleerde antwoorden — van Junior tot Senior.
Doneren