Ber aplikaci jako : každé zařízení je lokální . Studijní akce se zapisují do plus do append-only (outbox); po opětovném připojení zařízení a od své poslední synchronizace. Konflikty se neřeší globálním pravidlem, ale .
Ber aplikaci jako : každé zařízení je lokální . Studijní akce se zapisují do plus do append-only (outbox); po opětovném připojení zařízení a od své poslední synchronizace. Konflikty se neřeší globálním pravidlem, ale .
Mentální model: představ si to jako git — každé zařízení lokálně „commituje" v offline režimu a synchronizace je merge, ne přepis.
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)
Hodiny v telefonu jsou nespolehlivé a dvě zařízení mohou editovat stejný záznam offline, takže „last write wins" (LWW) tiše ztrácí data. Řeš podle sémantiky:
// op má id -> aplikuj idempotentně (opakování nezapočítá dvakrát). clientTs se NEdůvěřuje.
function mergeProgress(server, op) {
return {
// progress jen roste -> max: pozdní stará op ho nikdy netáhne zpět
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs je aditivní čítač -> přičti deltu, nepřepisuj
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Zde by prosté LWW nechalo zastaralé zařízení synchronizující se pozdě s progress: 0.3 přepsat serverových 0.9 → ztracený postup. Vzetí max a sečtení studiedMs činí synchronizaci nezávislou na pořadí — bezpečné, když se miliony zařízení synchronizují s rozházenými hodinami.
Tazatel zkoumá, zda víš, že hodinám klienta nelze věřit (tedy ne čisté timestamp LWW), zda děláš synchronizaci idempotentní (op id) a zda merguješ podle významu dat. Slabá odpověď: „použij timestampy, last write wins." Silná odpověď: replika + op log + idempotence + merge po jednotlivých polích + server jako zdroj pravdy — a explicitní pojmenování ztráty dat u LWW.
LWW je levné, ale ztrátové; sémantický merge vyžaduje promyšlení po jednotlivých polích, ale nic neztrácí. Po plné CRDT/OT sáhni jen tehdy, když potřebuješ skutečnou kolaborativní editaci (poznámky, dokumenty) — je nákladná, takže ji nepoužívej na všechno.
Knihovna IT otázek k pohovoru s podrobnými odpověďmi — od Junior po Senior.
Přispět