Traktuokite programėlę kaip : kiekvienas įrenginys yra lokali . Mokymosi veiksmai rašomi į plius į tik-pridedamą (outbox); prisijungus iš naujo įrenginys ir nuo paskutinės sinchronizacijos. Konfliktai sprendžiami viena globalia taisykle, o pagal .
Traktuokite programėlę kaip : kiekvienas įrenginys yra lokali . Mokymosi veiksmai rašomi į plius į tik-pridedamą (outbox); prisijungus iš naujo įrenginys ir nuo paskutinės sinchronizacijos. Konfliktai sprendžiami viena globalia taisykle, o pagal .
Mąstymo modelis: įsivaizduokite tai kaip git — kiekvienas įrenginys „commit'ina" lokaliai būdamas offline, o sinchronizacija yra merge, ne overwrite.
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ų laikrodžiai yra nepatikimi, ir du įrenginiai gali redaguoti tą patį įrašą būdami offline, todėl „last write wins" (LWW) tyliai praranda duomenis. Spręskite pagal semantiką:
// op turi id -> taikoma idempotentiškai (pakartojimai neskaičiuoja dvigubai). clientTs NĖRA patikimas.
function mergeProgress(server, op) {
return {
// progresas tik didėja -> max: vėlyva sena op niekada jo netempia atgal
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs yra sumuojantis skaitiklis -> pridėk delta, neperrašyk
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Čia paprastas LWW leistų pasenusiam įrenginiui, sinchronizuojančiam vėlai su progress: 0.3, perrašyti serverio 0.9 → prarastas progresas. Imant max ir sumuojant studiedMs, sinchronizacija tampa nepriklausoma nuo eiliškumo — saugu, kai milijonai įrenginių sinchronizuojasi su iškreiptais laikrodžiais.
Interviuotojas tikrina, ar žinote, kad kliento laikrodžiais negalima pasitikėti (taigi ne grynas timestamp LWW), ar padarote sinchronizaciją idempotentišką (op id) ir ar suliejate pagal duomenų prasmę. Silpnas atsakymas: „naudok timestamps, last write wins." Stiprus atsakymas: replika + op log + idempotencija + kiekvieno lauko merge + serveris kaip source of truth — ir aiškiai įvardinant LWW duomenų praradimo gedimą.
LWW pigus, bet nuostolingas; semantinis merge reikalauja apgalvojimo kiekvienam laukui, bet nieko nepraranda. Griebkitės pilno CRDT/OT tik tada, kai reikia tikro bendradarbiaujamojo redagavimo (užrašai, dokumentai) — tai brangu, tad nenaudokite jo visur.
IT pokalbių klausimų biblioteka su išsamiais atsakymais — nuo Junior iki Senior.
Paaukoti