Bạn sẽ thiết kế đồng bộ dữ liệu offline-first như thế nào?
Đáp án mẫu
Offline-first nghĩa là database cục bộ là nguồn dữ liệu chuẩn cho giao diện. Mạng chỉ đồng bộ ở chế độ nền.
Kho cục bộ. Dùng SQLite (hoặc lớp bọc như WatermelonDB, Room) và để UI đọc từ đó.
Ghi dữ liệu. Lưu thay đổi cục bộ trước và thêm vào hàng đợi outbox chứa các thao tác đang chờ. Mỗi thao tác có id duy nhất để server áp dụng idempotent khi thử lại.
Vòng lặp đồng bộ. Khi có mạng, đẩy outbox theo thứ tự, rồi kéo các thay đổi kể từ sync cursor gần nhất (timestamp hoặc version). Thử lại với exponential backoff.
Xung đột. Chọn chính sách theo từng thực thể: last-write-wins theo timestamp của server cho dữ liệu đơn giản, gộp theo từng trường cho tài liệu, hoặc hỏi người dùng khi mất dữ liệu gây tốn kém.
Chi tiết. Hiển thị trạng thái đồng bộ trên UI, xoá mềm bằng tombstone để việc xoá lan truyền, và xử lý migration schema ngay trên thiết bị.
Ý chính
- Database cục bộ là nguồn dữ liệu chuẩn cho UI
- Hàng đợi outbox gồm các thao tác idempotent với retry và backoff
- Kéo thay đổi bằng sync cursor
- Định nghĩa chính sách giải quyết xung đột cho từng thực thể
Câu hỏi nối tiếp thường gặp
- Việc xoá được đồng bộ sang các thiết bị khác như thế nào?
- Bạn xử lý migration schema thế nào trên thiết bị offline nhiều tuần?
Lỗi thường gặp
- Đọc trực tiếp từ mạng và coi cache là việc làm sau
- Thử lại thao tác không idempotent và tạo ra dữ liệu trùng