Aplikacijo obravnavajte kot : vsaka naprava je lokalna . Učna dejanja se zapišejo v plus append-only (outbox); ob ponovni povezavi naprava in od svoje zadnje sinhronizacije. Konflikti se ne razrešujejo z enim globalnim pravilom, temveč po .
Aplikacijo obravnavajte kot : vsaka naprava je lokalna . Učna dejanja se zapišejo v plus append-only (outbox); ob ponovni povezavi naprava in od svoje zadnje sinhronizacije. Konflikti se ne razrešujejo z enim globalnim pravilom, temveč po .
Miselni model: predstavljajte si to kot git — vsaka naprava lokalno "commita", medtem ko je offline, sinhronizacija pa je merge, ne prepis.
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)
Ure telefonov so nezanesljive in dve napravi lahko urejata isti zapis offline, zato "last write wins" (LWW) tiho izgublja podatke. Razrešite po semantiki:
// op ima id -> uporabi idempotentno (ponovni poskusi ne štejejo dvojno). clientTs NI zaupanja vreden.
function mergeProgress(server, op) {
return {
// progress se le povečuje -> max: pozen star op ga nikoli ne povleče nazaj
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs je aditivni števec -> prištej delto, ne prepiši
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Tukaj bi navadni LWW pustil, da zastarela naprava, ki se sinhronizira pozno z progress: 0.3, prepiše strežnikov 0.9 → izgubljen napredek. Vzemanje max in seštevanje studiedMs naredita sinhronizacijo neodvisno od vrstnega reda — varno, ko se milijoni naprav sinhronizirajo z zamaknjenimi urami.
Izpraševalec preverja, ali veste, da uram odjemalca ni mogoče zaupati (torej ne čisti timestamp LWW), ali naredite sinhronizacijo idempotentno (op id-ji) in ali mergate po pomenu podatkov. Šibek odgovor: "uporabi timestampe, last write wins." Močan odgovor: replika + op log + idempotentnost + merge po posameznem polju + strežnik kot source of truth — in eksplicitno poimenovanje LWW-jevega izgubljanja podatkov.
LWW je poceni, a izgubljiv; semantični merge zahteva razmislek o posameznem polju, a ničesar ne izgubi. Poseite po polnem CRDT/OT le, ko potrebujete pravo sodelovalno urejanje (zapiski, dokumenti) — je drago, zato ga ne uporabljajte za vse.
Knjižnica IT vprašanj za razgovore s podrobnimi odgovori — od začetnika do izkušenega.
Doniraj