Trajtoje aplikacionin si : çdo pajisje është një lokale. Veprimet e studimit shkruhen në një plus një vetëm-shtues (outbox); në rilidhje pajisja dhe që nga sinkronizimi i fundit. Konfliktet zgjidhen nga një rregull i vetëm global, por nga .
Trajtoje aplikacionin si : çdo pajisje është një lokale. Veprimet e studimit shkruhen në një plus një vetëm-shtues (outbox); në rilidhje pajisja dhe që nga sinkronizimi i fundit. Konfliktet zgjidhen nga një rregull i vetëm global, por nga .
Modeli mendor: mendoje si git — çdo pajisje bën "commit" lokalisht ndërsa është offline, dhe sinkronizimi është një merge, jo një mbishkrim.
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)
Orët e telefonave janë të pabesueshme dhe dy pajisje mund të editojnë të njëjtin record offline, kështu që "last write wins" (LWW) humbet të dhëna në heshtje. Zgjidhi sipas semantikës:
// op ka një id -> aplikoje në mënyrë idempotente (riprovat nuk numërojnë dyfish). clientTs NUK besohet.
function mergeProgress(server, op) {
return {
// progress vetëm rritet -> max: një op i vjetër me vonesë nuk e tërheq kurrë prapa
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs është numërues aditiv -> shto delta-n, mos mbishkruaj
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Këtu, LWW e thjeshtë do të lejonte një pajisje të vjetëruar që sinkronizohet vonë me progress: 0.3 të mbishkruante 0.9 e serverit → progres i humbur. Marrja e max dhe mbledhja e studiedMs e bën sinkronizimin të pavarur nga rendi — i sigurt kur miliona pajisje sinkronizohen me orë të shtrembëruara.
Intervistuesi po heton nëse e di që orët e klientit nuk mund të besohen (pra jo LWW i pastër me timestamp), nëse e bën sinkronizimin idempotent (op ids), dhe nëse bën merge sipas kuptimit të të dhënave. Një përgjigje e dobët: "përdor timestamps, last write wins." Një përgjigje e fortë: replica + op log + idempotency + merge për-fushë + serveri si source of truth — dhe emërtimi eksplicit i dështimit me humbje të dhënash të LWW.
LWW është i lirë por humbës; merge semantik kërkon mendim për-fushë por nuk humbet asgjë. Përdor CRDT/OT të plotë vetëm kur ke nevojë për editim vërtet bashkëpunues (shënime, dokumente) — është i kushtueshëm, ndaj mos e përdor për gjithçka.
Një bibliotekë pyetjesh intervistash IT me përgjigje të detajuara — nga Junior te Senior.
Dhuro