Behandla appen som : varje enhet är en lokal . Studiehandlingar skrivs till en plus en append-only (outbox); vid återanslutning och sedan sin senaste synk. Konflikter löses genom en global regel utan genom .
Behandla appen som : varje enhet är en lokal . Studiehandlingar skrivs till en plus en append-only (outbox); vid återanslutning och sedan sin senaste synk. Konflikter löses genom en global regel utan genom .
Mental modell: tänk på det som git — varje enhet "commit:ar" lokalt medan den är offline, och synk är en merge, inte en överskrivning.
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)
Telefonklockor är opålitliga och två enheter kan redigera samma post offline, så "last write wins" (LWW) tappar tyst data. Lös per semantik:
// op har ett id -> applicera idempotent (retries dubbelräknar inte). clientTs litas INTE på.
function mergeProgress(server, op) {
return {
// progress ökar bara -> max: en sen gammal op drar den aldrig bakåt
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs är en additiv räknare -> addera deltat, skriv inte över
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Här skulle vanlig LWW låta en föråldrad enhet som synkar sent med progress: 0.3 skriva över serverns 0.9 → förlorat framsteg. Att ta max och summera studiedMs gör synken ordningsoberoende — säkert när miljontals enheter synkar med skeva klockor.
Intervjuaren undersöker om du vet att klientklockor inte kan litas på (alltså inte ren timestamp-LWW), om du gör synk idempotent (op-ids), och om du merger per databetydelse. Ett svagt svar: "använd timestamps, last write wins." Ett starkt svar: replica + op log + idempotens + per-fält-merge + server som source of truth — och att uttryckligen namnge LWW:s dataförlust-fel.
LWW är billigt men förlustbenäget; semantisk merge kräver eftertanke per fält men tappar ingenting. Ta till fullständig CRDT/OT endast när du behöver äkta kollaborativ redigering (anteckningar, dokument) — det är kostsamt, så använd det inte till allt.
Ett bibliotek med IT-intervjufrågor och detaljerade svar — från Junior till Senior.
Donera