Perlakukan aplikasi sebagai : setiap perangkat adalah lokal. Aksi belajar ditulis ke plus append-only (outbox); saat tersambung kembali perangkat dan sejak sinkronisasi terakhir. Konflik diselesaikan oleh satu aturan global melainkan oleh .
Perlakukan aplikasi sebagai : setiap perangkat adalah lokal. Aksi belajar ditulis ke plus append-only (outbox); saat tersambung kembali perangkat dan sejak sinkronisasi terakhir. Konflik diselesaikan oleh satu aturan global melainkan oleh .
Model mental: anggap seperti git — tiap perangkat "commit" secara lokal saat offline, dan sinkronisasi adalah merge, bukan 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)
Jam ponsel tidak dapat diandalkan dan dua perangkat bisa mengedit record yang sama secara offline, sehingga "last write wins" (LWW) diam-diam kehilangan data. Selesaikan berdasarkan semantik:
// op punya id -> terapkan secara idempoten (retry tidak menghitung dobel). clientTs TIDAK dipercaya.
function mergeProgress(server, op) {
return {
// progress hanya naik -> max: op lama yang telat tak pernah menariknya mundur
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs adalah counter aditif -> tambahkan delta-nya, jangan overwrite
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Di sini, LWW polos akan membiarkan perangkat basi yang menyinkron terlambat dengan progress: 0.3 menimpa 0.9 milik server → progres hilang. Mengambil max dan menjumlahkan studiedMs membuat sinkronisasi tidak bergantung urutan — aman saat jutaan perangkat menyinkron dengan jam yang melenceng.
Pewawancara menyelidiki apakah Anda tahu jam klien tak bisa dipercaya (jadi bukan timestamp LWW murni), apakah Anda membuat sync idempoten (op id), dan apakah Anda merge berdasarkan makna data. Jawaban lemah: "pakai timestamp, last write wins." Jawaban kuat: replica + op log + idempotensi + merge per-field + server sebagai source of truth — dan menyebut secara eksplisit kegagalan data-loss LWW.
LWW murah tapi lossy; semantic merge butuh pemikiran per-field tapi tak kehilangan apa pun. Gunakan CRDT/OT penuh hanya saat Anda benar-benar butuh collaborative editing (catatan, dokumen) — itu mahal, jadi jangan pakai untuk semuanya.
Perpustakaan pertanyaan wawancara IT dengan jawaban mendetail — dari Junior hingga Senior.
Donasi