-
Movable tree CRDTs and Loro's implementation
-
Bối cảnh
- Trong hệ thống phân tán và phần mềm cộng tác, việc quản lý các quan hệ phân cấp rất phức tạp
- Khi mô hình hóa thao tác di chuyển bằng cách kết hợp xóa và chèn trong cấu trúc dữ liệu, rất khó để vừa giải quyết xung đột vừa đáp ứng kỳ vọng của người dùng
- Ví dụ, nếu cùng một nút bị di chuyển đồng thời sang các nút cha khác nhau, có thể tạo ra các nút trùng lặp với cùng nội dung
-
Xung đột trong cây có thể di chuyển
- Các thao tác chính của cây có thể di chuyển: tạo, xóa, di chuyển
- Các xung đột có thể phát sinh khi đồng bộ các thao tác đồng thời:
- Cùng một nút vừa bị xóa vừa bị di chuyển
- Cùng một nút bị di chuyển xuống dưới các nút khác nhau
- Các nút khác bị di chuyển gây ra vòng lặp
- Nút tổ tiên bị xóa trong khi nút hậu duệ bị di chuyển
-
Xóa và di chuyển cùng một nút
- Tương đối dễ giải quyết
- Tùy theo dấu thời gian trong hệ thống phân tán hoặc các yêu cầu cụ thể của ứng dụng, có thể áp dụng một thao tác và bỏ qua thao tác còn lại
-
Di chuyển cùng một nút xuống dưới các nút cha khác nhau
- Việc hợp nhất các thao tác di chuyển đồng thời phức tạp hơn
- Tùy ứng dụng có thể áp dụng nhiều cách tiếp cận khác nhau:
- Xóa nút rồi tạo một bản sao dưới nút cha khác
- Cho phép nút được liên kết với hai nút cha (thường không được phép)
- Sắp xếp tất cả thao tác và áp dụng tuần tự
-
Vòng lặp phát sinh do di chuyển các nút khác
- Việc xử lý vòng lặp do các thao tác di chuyển đồng thời gây ra là bài toán phức tạp
- Có nhiều cách giải quyết:
- Phát sinh lỗi
- Hiển thị các nút trong vòng lặp ở một vùng "timeout" đặc biệt
- Xử lý thao tác di chuyển trên máy chủ
- Dùng sắp xếp topo
- Ẩn cạnh gây ra vòng lặp
-
Xóa nút tổ tiên và di chuyển nút hậu duệ
- Việc di chuyển nút hậu duệ khi nút tổ tiên bị xóa là trường hợp dễ bị bỏ sót
- Nếu xóa trực tiếp toàn bộ nút hậu duệ, người dùng có thể hiểu nhầm là mất dữ liệu
-
Cách các ứng dụng phổ biến xử lý xung đột
- Dropbox: xử lý di chuyển tệp như xóa rồi tạo lại, nhưng có rủi ro mất dữ liệu
- Figma: máy chủ trung tâm phát hiện vòng lặp và từ chối thao tác để giữ tính nhất quán
-
CRDT cây có thể di chuyển
- Sử dụng CRDT thay vì giải pháp tập trung
- Các thuật toán CRDT ban đầu khó triển khai và có overhead lưu trữ lớn
- Nhờ tối ưu hóa liên tục, một số thuật toán đồng bộ cây dựa trên CRDT đã trở nên phù hợp cho môi trường production
-
Thao tác di chuyển có tính sẵn sàng cao cho cây được sao chép
- Hợp nhất ba thao tác của cây (tạo, xóa, di chuyển) thành thao tác di chuyển
- Thao tác di chuyển được định nghĩa là
Move t p m c
- Việc xóa nút được xử lý bằng cách di chuyển nó vào nút
TRASH
-
Dấu thời gian logic được sắp thứ tự toàn cục
- Sử dụng dấu thời gian Lamport để xác định thứ tự nhân quả của sự kiện trong hệ thống phân tán
- Số nhỏ hơn biểu thị sự kiện xảy ra sớm hơn
-
Áp dụng thao tác từ xa
- Tính an toàn của thao tác phụ thuộc vào trạng thái của cây tại thời điểm áp dụng
- Khi xử lý cập nhật từ xa, hệ thống sẽ hoàn tác các thao tác gần đây, chèn thao tác mới rồi áp dụng lại các thao tác đã hoàn tác
-
CRDT: phân cấp cây có thể thay đổi
- Mỗi nút theo dõi mọi nút cha trong lịch sử và gán bộ đếm cho chúng
- Khi đồng bộ tạo ra vòng lặp, nút sẽ được gắn lại vào nút cha lịch sử gần nhất
-
Triển khai CRDT cây có thể di chuyển trong Loro
- Triển khai thuật toán của Martin Kleppmann để cung cấp hiệu năng cao
- Tích hợp thuật toán
Fractional Index để sắp xếp các nút con
-
Xung đột tiềm ẩn khi sắp xếp nút con
- Khi chèn nhiều nút vào cùng một vị trí, có thể chúng được gán cùng
Fractional Index
- Dùng
PeerID để xác định thứ tự tương đối của các nút có cùng Fractional Index
-
Triển khai và kích thước mã hóa
Fractional Index cung cấp thứ tự cho các nút
- Kích thước mã hóa trong trường hợp xấu nhất có thể cần thêm byte, nhưng đây là tình huống hiếm
-
Công việc liên quan
- Ngoài
Fractional Index còn có CRDT danh sách có thể di chuyển
Fractional Index đơn giản trong triển khai và hữu ích khi chỉ cần thứ tự tương đối
-
Benchmark
- Đã thực hiện benchmark hiệu năng cho triển khai cây có thể di chuyển của Loro
- Có thể hỗ trợ cộng tác thời gian thực và checkout mượt mà các phiên bản lịch sử
-
Tóm tắt
- Giới thiệu độ khó trong việc triển khai CRDT cây có thể di chuyển và hai thuật toán đổi mới
- Loro tích hợp thuật toán của Martin Kleppmann và
Fractional Index để đáp ứng nhiều kịch bản ứng dụng khác nhau
-
Tổng kết của GN⁺
- CRDT cây có thể di chuyển đóng vai trò quan trọng trong việc quản lý cấu trúc dữ liệu phân cấp trong hệ thống phân tán
- Loro cung cấp hiệu năng cao và khả năng xử lý xung đột hiệu quả, phù hợp cho các ứng dụng cộng tác thời gian thực
- Sử dụng
Fractional Index để giải quyết bài toán sắp xếp nút con
- Các dự án khác có tính năng tương tự gồm Figma và Dropbox
1 bình luận
Ý kiến trên Hacker News
Đang phát triển một trình soạn thảo nhiều người chơi mới
Cung cấp React Table Library dưới dạng mã nguồn mở
Xin lời khuyên
Khi làm việc với nội dung văn bản có định dạng như Google Docs/Zoho Writer, cần thao tác trên cây
Tò mò không biết có CRDT thực tiễn nào cho các ứng dụng đậm đặc dữ liệu như hình ảnh (pixel) và mô hình 3D hay không
Nghĩ rằng đoạn đầu tiên nghe giống giọng văn của ChatGPT