Behandle appen som : hver enhet er en lokal . Studiehandlinger skrives til en pluss en append-only (outbox); ved gjentilkobling og siden siste synk. Konflikter løses av én global regel, men av .
Behandle appen som : hver enhet er en lokal . Studiehandlinger skrives til en pluss en append-only (outbox); ved gjentilkobling og siden siste synk. Konflikter løses av én global regel, men av .
Mental modell: tenk på det som git — hver enhet «committer» lokalt mens den er offline, og synk er en merge, ikke en overskriving.
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)
Telefonklokker er upålitelige og to enheter kan redigere samme record offline, så «last write wins» (LWW) taper data stille. Løs etter semantikk:
// op har en id -> apply idempotent (retries dobbelttelles ikke). clientTs er IKKE til å stole på.
function mergeProgress(server, op) {
return {
// progress øker bare -> max: en sen gammel op drar den aldri bakover
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs er en additiv teller -> legg til deltaet, ikke overskriv
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Her ville ren LWW latt en utdatert enhet som synker sent med progress: 0.3 overskrive serverens 0.9 → tapt fremdrift. Å ta max og summere studiedMs gjør synk ordens-uavhengig — trygt når millioner av enheter synker med skjeve klokker.
Intervjueren undersøker om du vet at klientklokker ikke er til å stole på (altså ikke ren timestamp-LWW), om du gjør synk idempotent (op ids), og om du merger etter datamening. Et svakt svar: «bruk timestamps, last write wins.» Et sterkt svar: replica + op log + idempotens + per-felt-merge + server som source of truth — og å navngi LWW-ens datatap-feil eksplisitt.
LWW er billig, men tapt-utsatt; semantisk merge krever per-felt-tenkning, men taper ingenting. Grip til full CRDT/OT kun når du trenger ekte samarbeidsredigering (notater, dokumenter) — det er kostbart, så ikke bruk det til alt.
Et bibliotek av IT-intervjuspørsmål med detaljerte svar — fra Junior til Senior.
Doner