Aplikaciju tretiraj kao : svaki uređaj je lokalna . Radnje učenja upisuju se u te u append-only (outbox); pri ponovnom spajanju uređaj i od zadnje sinkronizacije. Konflikti se razrješavaju jednim globalnim pravilom nego .
Aplikaciju tretiraj kao : svaki uređaj je lokalna . Radnje učenja upisuju se u te u append-only (outbox); pri ponovnom spajanju uređaj i od zadnje sinkronizacije. Konflikti se razrješavaju jednim globalnim pravilom nego .
Mentalni model: zamisli to kao git — svaki uređaj lokalno "commita" dok je offline, a sinkronizacija je merge, ne prepisivanje.
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)
Satovi na telefonima su nepouzdani i dva uređaja mogu offline urediti isti zapis, pa "last write wins" (LWW) tiho gubi podatke. Razrješavaj prema semantici:
// op ima id -> primijeni idempotentno (ponovni pokušaji ne broje dvostruko). clientTs se NE vjeruje.
function mergeProgress(server, op) {
return {
// progress se samo povećava -> max: kasni stari op nikad ga ne povuče unatrag
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs je aditivni brojač -> dodaj deltu, ne prepisuj
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Ovdje bi obični LWW dopustio da zastarjeli uređaj koji kasno sinkronizira s progress: 0.3 prepiše serverovih 0.9 → izgubljen napredak. Uzimanje max i zbrajanje studiedMs čini sinkronizaciju neovisnom o redoslijedu — sigurno kad milijuni uređaja sinkroniziraju s iskrivljenim satovima.
Ispitivač provjerava znaš li da se klijentskim satovima ne može vjerovati (dakle ne čisti timestamp LWW), činiš li sinkronizaciju idempotentnom (op id-jevi) i spajaš li prema značenju podataka. Slab odgovor: "koristi timestampove, last write wins." Jak odgovor: replika + op log + idempotentnost + merge po polju + server kao izvor istine — i eksplicitno imenovanje LWW-ovog gubitka podataka.
LWW je jeftin ali gubi podatke; semantički merge traži razmišljanje po polju ali ništa ne gubi. Poseži za punim CRDT/OT samo kad ti stvarno treba kolaborativno uređivanje (bilješke, dokumenti) — skupo je, pa ga ne koristi za sve.
Knjižnica IT pitanja za razgovore za posao s detaljnim odgovorima — od Juniora do Seniora.
Doniraj