0

[Open Source] #29 - AFFiNE: Hệ điều hành kiến thức Local-first và sức mạnh hợp nhất Docs & Whiteboard từ Rust

Trong thế giới của các công cụ quản trị tri thức (Knowledge Management), Notion hay Miro đã quá nổi tiếng. Tuy nhiên, rào cản về quyền riêng tư và sự phụ thuộc hoàn toàn vào Cloud luôn là nỗi lo của các chuyên gia. AFFiNE xuất hiện như một "kẻ thách thức" mạnh mẽ, tái định nghĩa khái niệm không gian làm việc bằng triết lý Local-first và kiến trúc Hyper-merged — nơi tài liệu, bảng trắng và cơ sở dữ liệu hợp nhất làm một.

Dưới góc độ kỹ thuật, AFFiNE là một kiệt tác về việc kết hợp hiệu năng cực hạn của Rust với tính linh hoạt của TypeScript, tạo ra một hệ thống soạn thảo thời gian thực không có độ trễ.

Github: https://github.com/toeverything/AFFiNE

🛠️ 1. Nền tảng công nghệ: Sự giao thoa giữa TypeScript và Rust

AFFiNE không chọn con đường dễ dàng; họ xây dựng một Stack công nghệ phức tạp để tối ưu hóa trải nghiệm người dùng trên mọi nền tảng:

  • Ngôn ngữ lập trình:
    • TypeScript (91%): Đảm nhiệm toàn bộ logic UI và ứng dụng.
    • Rust (3%): Dù chiếm tỉ lệ nhỏ nhưng đây là "linh hồn" của hệ thống, cung cấp năng lượng cho OctoBase (Database engine) và y-octo (Bản triển khai CRDT siêu nhanh).
  • Editor Framework (BlockSuite): Thay vì dùng các bộ soạn thảo có sẵn, AFFiNE tự phát triển BlockSuite dựa trên Lit (Web Components). Điều này giúp các "khối" (blocks) cực nhẹ và có thể render mượt mà dù là văn bản hay hình vẽ phức tạp.
  • State Management: Sử dụng Jotai để quản lý trạng thái ứng dụng một cách nguyên tử (atomic), giúp việc cập nhật giao diện diễn ra tức thì.
  • Bridge: Sử dụng Napi-rs để làm cầu nối hiệu năng cao, cho phép mã JavaScript gọi trực tiếp các hàm xử lý dữ liệu nặng viết bằng Rust.

🏗️ 2. Tư duy kiến trúc: Local-first và Everything is a Block

Kiến trúc của AFFiNE được xây dựng dựa trên những tư duy đột phá về phần mềm hiện đại:

Local-first (Dữ liệu thuộc về người dùng)

Khác với các công cụ SaaS truyền thống, AFFiNE ưu tiên lưu trữ dữ liệu tại máy cục bộ. Dữ liệu được ghi xuống SQLite (Desktop) hoặc IndexedDB (Web) trước khi đồng bộ lên Cloud. Điều này đảm bảo ứng dụng hoạt động hoàn hảo ngay cả khi không có mạng và mang lại tốc độ phản hồi bằng 0 (Zero latency).

Hyper-merged (Hợp nhất không biên giới)

Đây là điểm "ăn tiền" nhất của AFFiNE. Nhờ kiến trúc khối đồng nhất, bạn có thể chuyển đổi một tài liệu văn bản (Docs) sang dạng bảng trắng vô hạn (Edgeless Canvas) chỉ bằng một cú click. Mọi đối tượng đều giữ nguyên trạng thái và liên kết, xóa bỏ rào cản giữa tư duy tuyến tính (văn bản) và tư duy hình ảnh (sơ đồ).


🔄 3. Các kỹ thuật chính (Key Techniques)

1. OctoBase & CRDT (Yjs)

Để nhiều người cùng chỉnh sửa mà không gây xung đột (Conflict), AFFiNE sử dụng thuật toán CRDT (Conflict-free Replicated Data Types). Phiên bản Rust của thuật toán này (y-octo) giúp việc hợp nhất dữ liệu từ hàng trăm người dùng diễn ra trơn tru mà không cần một server trung tâm giải quyết tranh chấp.

2. Turbo-renderer cho Canvas

Việc xử lý hàng ngàn đối tượng đồ họa trên bảng trắng thường gây lag. AFFiNE sử dụng kỹ thuật render lai giữa DOMCanvas, kết hợp với khả năng tính toán của Rust để đảm bảo các thao tác zoom, pan hay vẽ tự do luôn đạt mức 60 FPS.

3. Hệ thống Adapter đa năng

Mã nguồn của AFFiNE chứa các bộ chuyển đổi (Adapters) cực kỳ mạnh mẽ cho phép nhập/xuất dữ liệu từ Notion, Markdown, HTML hay PDF. Điều này biến AFFiNE thành một "Hub" trung chuyển tri thức cực kỳ linh hoạt.


📊 4. Workflow: Luồng xử lý dữ liệu thời gian thực

Dưới đây là sơ đồ trình tự mô tả cách AFFiNE xử lý một thao tác chỉnh sửa của người dùng theo mô hình Local-first:

image.png


⚖️ 5. So sánh chiến lược

Tiêu chí AFFiNE Notion / Miro
Dữ liệu Local-first (Riêng tư tuyệt đối) Cloud-first (Phụ thuộc server)
Hiệu năng Cực cao (Nhờ lõi Rust) Trung bình (Dựa trên Web thuần)
Chế độ Offline Hoạt động hoàn hảo Hạn chế rất nhiều
Khả năng hợp nhất Docs & Whiteboard là một Tách biệt hai môi trường

✅ Kết luận: Tại sao AFFiNE là hình mẫu?

AFFiNE không chỉ là một công cụ ghi chú, nó là một minh chứng kỹ thuật cho thấy sức mạnh của việc kết hợp Rust vào Web. Bằng cách giải quyết bài toán khó nhất là đồng bộ dữ liệu không xung đột (CRDT) và ưu tiên quyền sở hữu dữ liệu (Local-first), AFFiNE đã tạo ra một tiêu chuẩn mới cho các ứng dụng Productivity trong tương lai. Đối với các kỹ sư phần mềm, việc nghiên cứu cách AFFiNE tổ chức Monorepo và cách họ "cầu nối" giữa JS và Rust là những bài học vô giá.


Hy vọng bản phân tích chuyên sâu này giúp bạn có cái nhìn mới về kiến trúc ứng dụng hiện đại. Đừng quên UpvoteFollow mình để khám phá những "kỳ quan" mã nguồn tiếp theo!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí