Prolly: Thư viện Rust xây dựng bản đồ có thứ tự với cấu trúc cây chia sẻ nội dung

Công nghệ17 tháng 8, 2026·6 phút đọc

Prolly là một thư viện Rust mã nguồn mở cung cấp cấu trúc dữ liệu cây prolly (content-addressed) cho phép lưu trữ cặp key-value có thứ tự với khả năng chia sẻ cấu trúc, diff và merge hiệu quả. Thư viện này đặc biệt hữu ích cho các ứng dụng local-first, hệ thống nhúng và cơ sở dữ liệu phi tập trung nhờ tính bất biến và xác định của nội dung. Với kiến trúc runtime-neutral và hỗ trợ nhiều backend lưu trữ, Prolly mở ra hướng tiếp cận mới cho việc xây dựng các ứng dụng đồng bộ dữ liệu phức tạp.

Prolly: Thư viện Rust xây dựng bản đồ có thứ tự với cấu trúc cây chia sẻ nội dung

Prolly: Thư viện Rust mang lại sức mạnh của cây chia sẻ nội dung cho thế giới local-first và dữ liệu phi tập trung

Một thư viện Rust mới có tên Prolly vừa được giới thiệu trên GitHub, cung cấp một bản đồ (map) có thứ tự, bất biến với kiến trúc prolly tree (cây prolly). Thư viện này cho phép xây dựng các hệ thống lưu trữ và đồng bộ dữ liệu với khả năng chia sẻ cấu trúc, diff, merge một cách cực kỳ hiệu quả, hứa hẹn trở thành nền tảng cho các ứng dụng local-first, cơ sở dữ liệu nhúng và kho dữ liệu phân tán. Điểm đặc biệt của Prolly nằm ở việc sử dụng định danh nội dung (content addressing) và kỹ thuật phân đoạn xác định (deterministic chunking) để tạo ra các phiên bản dữ liệu có tính ổn định và dễ dàng so sánh.

Vấn đề mà Prolly giải quyết

Trong các hệ thống lưu trữ truyền thống, việc cập nhật dữ liệu thường dẫn đến việc phải ghi lại toàn bộ cấu trúc dữ liệu, gây tốn kém về bộ nhớ và băng thông, đặc biệt khi cần đồng bộ giữa nhiều thiết bị hoặc máy chủ. Các cấu trúc như B-tree hay LSM-tree hiệu quả cho việc đọc/ghi nhưng lại rất khó để so sánh và hợp nhất các phiên bản khác nhau.

Prolly tree giải quyết bài toán này bằng một cách tiếp cận khác:

  • Định danh nội dung (Content addressing): Mỗi nút (node) trong cây được định danh bằng hàm băm SHA-256 của chính nội dung của nó. Nếu hai nút có cùng nội dung, chúng sẽ có cùng định danh (CID). Điều này cho phép phát hiện nhanh chóng các phần dữ liệu không thay đổi giữa các phiên bản.
  • Phân đoạn xác định (Content-defined chunking): Thay vì chia cây theo số lượng cố định, Prolly sử dụng các hàm băm rolling và các ngưỡng để xác định ranh giới của các nút dựa trên nội dung. Nhờ đó, việc thêm, sửa một phần nhỏ dữ liệu chỉ ảnh hưởng đến một số ít nút cục bộ, trong khi phần lớn cây vẫn giữ nguyên định danh.

Kết quả là, việc diffmerge giữa hai phiên bản dữ liệu trở nên cực kỳ nhanh chóng vì có thể bỏ qua toàn bộ các nhánh con (subtrees) không thay đổi. Điều này lý tưởng cho các ứng dụng cần đồng bộ dữ liệu thường xuyên, chẳng hạn như các ứng dụng ghi chú, quản lý tác vụ, hoặc cơ sở dữ liệu nhúng trên thiết bị di động.

Kiến trúc và thiết kế nổi bật của Prolly

Hoạt động bất biến và chia sẻ cấu trúc

API của Prolly được thiết kế theo phong cách bất biến (immutable). Các thao tác như put, delete hay batch không sửa đổi cây hiện tại mà trả về một cây mới. Cây cũ vẫn hợp lệ và chia sẻ các nút không thay đổi với cây mới, tương tự như cách hoạt động của Git. Điều này giúp việc quản lý phiên bản và rollback trở nên đơn giản và an toàn.

use prolly::{Config, MemStore, Prolly};

let store = MemStore::new();
let prolly = Prolly::new(store, Config::default());

let tree = prolly.create();
let tree = prolly.put(&tree, b"name".to_vec(), b"Alice".to_vec()).unwrap();

let value = prolly.get(&tree, b"name").unwrap();
assert_eq!(value, Some(b"Alice".to_vec()));

Tầng lưu trữ cắm được (Pluggable Store)

Thư viện không gắn chặt với một cơ sở dữ liệu cụ thể nào. Nó định nghĩa một trait Store tối giản và cung cấp sẵn nhiều bộ điều hợp (adapters):

  • MemStore: cho mục đích thử nghiệm và các ứng dụng nhẹ.
  • FileNodeStore: lưu trữ bền vững dạng tệp/đối tượng.
  • prolly-store-sqlite: backend SQLite phổ biến.
  • prolly-store-turso: nhúng engine Turso Database async.
  • prolly-store-rocksdb: backend RocksDB nhúng.
  • prolly-store-redb: backend thuần Rust.

Với kiến trúc này, các nhà phát triển có thể dễ dàng tích hợp Prolly vào hệ thống hiện tại hoặc viết backend tùy chỉnh.

Hỗ trợ đồng bộ mạnh mẽ: Diff, Merge, và Bằng chứng (Proofs)

Prolly cung cấp một bộ API phong phú cho việc đồng bộ dữ liệu:

  • diffrange_diff để tìm sự khác biệt giữa hai phiên bản cây.
  • diff_pagestructural_diff_page cho phép xử lý các tác vụ diff lớn một cách tuần tự, có khả năng check-point để tránh gián đoạn.
  • merge thực hiện hợp nhất ba chiều (three-way merge) với khả năng tùy biến bộ giải quyết xung đột (resolver).
  • Các API prove_* cho phép tạo ra các bằng chứng mật mã (proofs) để một bên thứ ba có thể xác minh dữ liệu trong cây mà không cần truy cập vào toàn bộ kho lưu trữ. Điều này vô cùng quan trọng cho các ứng dụng phi tập trung hoặc các hệ thống cần xác minh tính toàn vẹn dữ liệu từ xa.

IndexedMap và VersionedMap: Các lớp cao cấp hơn

Ngoài bản đồ cơ bản, Prolly còn cung cấp các facade như VersionedMapIndexedMap để quản lý nhiều phiên bản và các chỉ mục phụ (secondary indexes). Các lớp này giúp đơn giản hóa việc xây dựng các ứng dụng phức tạp như trình quản lý bộ nhớ hội thoại cho AI, hệ thống quản lý tài liệu, hay kho lưu trữ vector cho các ứng dụng RAG (Retrieval-Augmented Generation).

Ví dụ, ứng dụng có thể dễ dàng tạo ra một bản đồ phiên bản với các tính năng như lịch sử, snapshot và rollback:

use prolly::{Config, MemStore, Prolly, VersionedMap};

let prolly = Prolly::new(MemStore::new(), Config::default());
let mut versioned_map = VersionedMap::new(prolly);
versioned_map.insert(b"key".to_vec(), b"value".to_vec()).unwrap();
let version = versioned_map.commit().unwrap(); // Tạo một phiên bản

Dành cho ai và ứng dụng tiềm năng

Prolly là một thư viện cấp thấp, đòi hỏi người dùng có kiến thức về cấu trúc dữ liệu và đồng bộ. Tuy nhiên, tiềm năng ứng dụng của nó là rất lớn:

  • Các ứng dụng Local-first: Xây dựng các ứng dụng như ghi chú (như Obsidian), quản lý dự án, hoặc CRM hoạt động offline và đồng bộ mượt mà qua mạng ngang hàng.
  • Cơ sở dữ liệu nhúng: Thay thế cho SQLite trong các ứng dụng cần quản lý phiên bản dữ liệu phức tạp hoặc đồng bộ nhiều thiết bị.
  • Hệ thống lưu trữ phân tán: Sử dụng làm lớp lưu trữ dữ liệu bất biến cho các blockchain, hệ thống file phi tập trung (IPFS-like).
  • Nền tảng AI và RAG: Quản lý bộ nhớ hội thoại, chỉ mục tài liệu và vector embeddings một cách hiệu quả với khả năng truy vết nguồn gốc và phiên bản.

Kiến trúc cây ProllyKiến trúc cây Prolly

Đánh giá và kết luận

Prolly là một dự án mã nguồn mở đầy tham vọng với thiết kế kỹ thuật rất chặt chẽ và có chiều sâu. Việc áp dụng các nguyên lý của Gitcây Merkle vào một cấu trúc dữ liệu có thứ tự mở ra một hướng đi mới cho việc xây dựng các hệ thống dữ liệu hiện đại, đặc biệt là trong bối cảnh các ứng dụng ngày càng hướng tới phân quyền và làm việc offline.

Mặc dù thư viện vẫn đang trong giai đoạn tiền phát hành (pre-0.1) và API có thể thay đổi, nhưng những gì mà Prolly thể hiện cho thấy một nền tảng vững chắc cho tương lai. Cộng đồng phát triển Rust và những ai quan tâm đến việc xây dựng các hệ thống dữ liệu tiên tiến nên theo dõi sát sao dự án này. Bạn có thể tìm thấy mã nguồn và tài liệu chi tiết tại GitHub: https://github.com/crabbuild/prolly.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗