𝗖𝗥𝗗𝗧𝘀 𝗶𝗻 𝗞𝗼𝘁𝗹𝗶𝗻 𝗠𝘂𝗹𝘁𝗶𝗽𝗹𝗮𝘁𝗳𝗼𝗿𝗺: 𝗞𝗶𝗹𝗹 𝗬𝗼𝘂𝗿 𝗦𝘆𝗻𝗰 𝗦𝗲𝗿𝘃𝗲𝗿
Hầu hết các đội ngũ đều xây dựng một máy chủ trung tâm để xử lý các xung đột dữ liệu. Máy chủ nhận các lệnh ghi, chọn ra một kết quả thắng cuộc và hy vọng mọi thứ sẽ ổn. Điều này tạo ra một điểm yếu duy nhất (single point of failure) và mã nguồn phức tạp cần phải bảo trì.
Conflict-Free Replicated Data Types (CRDTs) thay đổi điều này. Mọi thiết bị đều đạt được cùng một trạng thái mà không cần một "ông chủ" trung tâm. Đó là một sự đảm bảo về mặt toán học.
Bạn có thể thay thế backend đồng bộ hóa của mình bằng một kho lưu trữ blob đơn giản. Máy chủ của bạn sẽ trở thành một trạm chuyển tiếp (relay) lưu trữ các blob dữ liệu. Nó không cần phải hiểu dữ liệu của bạn.
Sử dụng các primitive này cho các ứng dụng di động của bạn:
• LWW-Register: Sử dụng cho hồ sơ người dùng và cài đặt. • G-Counter: Sử dụng cho phân tích hoặc lượt xem. • PN-Counter: Sử dụng cho kho hàng hoặc tổng giỏ hàng. • OR-Set: Sử dụng cho thẻ (tags) và mục yêu thích.
Đối với hầu hết các ứng dụng di động, LWW-Registers và OR-Sets có thể đáp ứng gần như mọi nhu cầu.
Implementation Tip:
Khi bạn xây dựng một LWW-Register, hãy luôn bao gồm một nodeId. Nếu hai bản cập nhật có cùng một mốc thời gian (timestamp) chính xác, nodeId sẽ đóng vai trò là yếu tố phân xử (tiebreaker). Nếu không có điều này, các thiết bị của bạn sẽ không đồng bộ về cùng một trạng thái.
State-based vs. Operation-based:
Hãy chọn State-based (CvRDT) cho di động. Nó hoạt động tốt trên các mạng không ổn định vì quá trình hợp nhất (merge) có tính idempotent (tính lũy đẳng). Nếu việc đồng bộ thất bại giữa chừng, bạn chỉ cần thử lại.
Tránh sử dụng Operation-based (CmRDT) trong giai đoạn đầu. Nó yêu cầu việc truyền tải phải đạt được chính xác một lần (exactly-once delivery). Việc xây dựng cơ sở hạ tầng đó trên mạng di động là rất khó khăn và làm tăng thêm sự phức tạp mà bạn đang muốn tránh.
The Architecture:
- Xây dựng logic CRDT của bạn trong module
commonMaincủa dự án Kotlin Multiplatform. - Sử dụng SQLDelight để lưu trữ dữ liệu cục bộ.
- Đồng bộ hóa các blob dữ liệu tới một dịch vụ như S3 hoặc Cloud Storage.
- Backend của bạn sẽ luôn đơn giản và rẻ tiền.
Đừng xây dựng các công cụ đồng bộ hóa phức tạp nữa. Hãy sử dụng CRDTs để chuyển logic về phía client. Điều này cho phép bạn tập trung vào việc xây dựng các tính năng thay vì phải quản lý việc xoay vòng máy chủ (server rotations).
Source: https://dev.to/software_mvp-factory/crdts-in-kotlin-multiplatform-kill-your-sync-server-28n8