Coi app là : mỗi thiết bị là một cục bộ. Thao tác học được ghi vào + một (hàng đợi thay đổi, append-only); khi online lại, thiết bị lên và kể từ lần đồng bộ cuối. Xung đột xử lý bằng một quy tắc chung, mà .
Coi app là : mỗi thiết bị là một cục bộ. Thao tác học được ghi vào + một (hàng đợi thay đổi, append-only); khi online lại, thiết bị lên và kể từ lần đồng bộ cuối. Xung đột xử lý bằng một quy tắc chung, mà .
Mô hình dễ hình dung: giống git — mỗi thiết bị "commit" cục bộ khi offline, còn sync là một lần merge, không phải ghi đè.
Thiết bị (offline) Server = source of truth
┌──────────────────┐ online lại ┌───────────────────────────┐
│ Local DB (SQLite)│ push ops (delta) │ Sync API /sync │
│ + Op log (outbox)│ ─────────────────▶ │ • idempotent theo op.id │
│ cursor = lastSeen│ ◀───────────────── │ • merge theo ngữ nghĩa │
└──────────────────┘ pull changes>cursor└───────────────────────────┘
Progress DB (Postgres)
Đồng hồ điện thoại không đáng tin và hai thiết bị có thể sửa cùng bản ghi khi offline, nên "ghi sau thắng" (LWW) sẽ âm thầm mất dữ liệu. Giải quyết theo ngữ nghĩa:
// op có id -> áp idempotent (retry không cộng đôi). clientTs KHÔNG đáng tin.
function mergeProgress(server, op) {
return {
// progress đơn điệu tăng -> max: op cũ tới muộn cũng không kéo lùi tiến độ
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs là counter cộng dồn -> cộng delta, không ghi đè
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
Ở đây, LWW thuần sẽ để một máy cũ sync muộn với progress: 0.3 đè lên 0.9 trên server → mất tiến độ. Lấy max và cộng dồn studiedMs khiến sync không phụ thuộc thứ tự tới — an toàn khi hàng triệu thiết bị đồng bộ lệch giờ.
Người phỏng vấn đang dò: bạn có biết đồng hồ client không tin được (nên không phải LWW theo timestamp thuần), có làm sync idempotent (op id) và có hợp nhất theo ý nghĩa dữ liệu không. Câu trả lời yếu: "dùng timestamp, ghi sau thắng". Câu mạnh: replica + op log + idempotency + merge theo trường + server là source of truth — và gọi tên đúng điểm mất dữ liệu của LWW.
LWW rẻ nhưng lossy; semantic merge cần hiểu từng trường nhưng không mất dữ liệu. Chỉ dùng CRDT/OT đầy đủ khi cần soạn thảo cộng tác thật (ghi chú, văn bản) — đừng dùng cho mọi thứ vì tốn kém.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ