Behandl appen som : hver enhed er en lokal . Studiehandlinger skrives til en plus en append-only (outbox); ved genforbindelse og siden sin sidste sync. Konflikter løses af én global regel, men af .
Behandl appen som : hver enhed er en lokal . Studiehandlinger skrives til en plus en append-only (outbox); ved genforbindelse og siden sin sidste sync. Konflikter løses af én global regel, men af .
Mental model: tænk på det som git — hver enhed "committer" lokalt mens den er offline, og sync er en merge, ikke en overskrivning.
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)
Telefon-ure er upålidelige, og to enheder kan redigere den samme record offline, så "last write wins" (LWW) taber stille data. Løs efter semantik:
// op har et id -> anvend idempotent (retries dobbelttæller ikke). clientTs er IKKE betroet.
function mergeProgress(server, op) {
return {
// progress stiger kun -> max: en sen gammel op trækker den aldrig baglæns
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs er en additiv tæller -> læg delta til, overskriv ikke
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Her ville almindelig LWW lade en forældet enhed, der syncer sent med progress: 0.3, overskrive serverens 0.9 → tabt fremgang. At tage max og summere studiedMs gør sync rækkefølge-uafhængig — sikkert når millioner af enheder syncer med skæve ure.
Intervieweren undersøger om du ved at klient-ure ikke kan betros (altså ikke ren timestamp-LWW), om du gør sync idempotent (op-ids), og om du merger efter databetydning. Et svagt svar: "brug timestamps, last write wins." Et stærkt svar: replica + op-log + idempotens + per-felt-merge + server som source of truth — og at navngive LWW's datatab-fejl eksplicit.
LWW er billig men lossy; semantisk merge kræver per-felt tanke men taber intet. Grib til fuld CRDT/OT kun når du har brug for ægte collaborative editing (noter, dokumenter) — det er dyrt, så brug det ikke til alt.
Et bibliotek af IT-interviewspørgsmål med detaljerede svar — fra Junior til Senior.
Donér