0

[Open Source] #32 - Actual Budget: Kiến trúc tài chính Local-first và nghệ thuật đồng bộ dữ liệu không xung đột với CRDT

Trong thế giới của các ứng dụng quản lý tài chính cá nhân, quyền riêng tư và tốc độ truy xuất dữ liệu luôn là hai yếu tố sống còn. Đa số các ứng dụng hiện nay (như Mint hay YNAB) đều đi theo hướng Cloud-first, nơi dữ liệu của bạn nằm trên máy chủ của họ. Actual Budget phá vỡ quy tắc này bằng triết lý Local-first, biến thiết bị của bạn thành trung tâm xử lý dữ liệu thực thụ.

Dưới góc độ kỹ sư, đây là một dự án mẫu mực về cách xây dựng một hệ thống Offline-capable (khả năng hoạt động ngoại tuyến) bền bỉ, sử dụng thuật toán CRDT để đồng bộ hóa dữ liệu không xung đột và một kiến trúc Headless Core cực kỳ linh hoạt.


Github: https://github.com/actualbudget/actual

🛠️ 1. Nền tảng công nghệ: TypeScript & SQLite Anywhere

Actual Budget sở hữu một ngăn xếp công nghệ (stack) được tối ưu cho việc lưu trữ và tính toán cục bộ:

  • TypeScript (90%): Ngôn ngữ chủ đạo giúp đảm bảo tính chính xác tuyệt đối cho các logic tính toán tài chính — nơi mà một sai sót nhỏ về kiểu dữ liệu (Type) có thể dẫn đến sai lệch con số.
  • SQLite & better-sqlite3: Thay vì các Database phức tạp, dự án sử dụng SQLite làm "trái tim" lưu trữ. Dữ liệu nằm ngay trên máy người dùng, cho phép truy vấn với tốc độ mili giây mà không cần chờ đợi phản hồi từ network.
  • Electron & Vite: Cung cấp trải nghiệm ứng dụng Desktop mượt mà trên Windows, macOS và Linux. Việc chuyển đổi sang Vite giúp quá trình phát triển (HMR) và đóng gói nhanh hơn đáng kể so với Webpack cũ.
  • Monorepo Management: Sử dụng Yarn 4 Workspaces kết hợp với Lage (Task runner từ Microsoft). Kỹ thuật này giúp build và test hàng chục gói (packages) trong repo một cách song song, chỉ xử lý những phần có thay đổi (caching).

🏗️ 2. Trụ cột kiến trúc: Headless Core và Local-first

Kiến trúc của Actual Budget tập trung vào việc tách biệt hoàn toàn logic nghiệp vụ khỏi giao diện:

Headless Core (loot-core)

Đây là thành phần quan trọng nhất. Toàn bộ logic về tính toán ngân sách (Envelope Budgeting), quản lý giao dịch và tương tác với SQLite được đóng gói trong loot-core. Nó có thể chạy trong trình duyệt (via Web Workers), trong Node.js hoặc Electron. Điều này cho phép ứng dụng Web và Desktop chia sẻ 100% logic xử lý.

Triết lý Local-first & E2EE

Dữ liệu của bạn được lưu và xử lý trực tiếp trên thiết bị. Server đồng bộ (sync-server) chỉ đóng vai trò là "trạm trung chuyển" các gói tin đã được mã hóa đầu cuối (E2EE). Ngay cả chủ sở hữu server cũng không thể đọc được bạn đã tiêu bao nhiêu tiền, vì chìa khóa giải mã nằm duy nhất trên thiết bị của bạn.


🔄 3. Các kỹ thuật "Pro-level" trong mã nguồn

1. Đồng bộ không xung đột với CRDT

Thử thách lớn nhất của Local-first là khi bạn nhập liệu trên cả điện thoại và máy tính cùng lúc. Actual Budget sử dụng CRDT (Conflict-free Replicated Data Types). Mỗi thay đổi được gắn một Hybrid Logical Clock (HLC). Khi các thiết bị kết nối lại, hệ thống sẽ tự động hợp nhất (merge) các thay đổi dựa trên timestamp và cấu trúc dữ liệu mà không bao giờ xảy ra tình trạng mất dữ liệu hay báo lỗi "Conflict".

2. AQL (Actual Query Language)

Để việc truy vấn dữ liệu tài chính trở nên đơn giản và bảo mật hơn, dự án xây dựng một lớp truy vấn riêng gọi là AQL. Nó bao bọc lấy SQL thuần túy, cho phép lập trình viên viết các câu lệnh filter, group dữ liệu một cách trực quan và tránh được các lỗi SQL Injection tiềm ẩn.

3. Protocol Buffers (Protobuf)

Thay vì dùng JSON cồng kềnh để đồng bộ hóa, Actual Budget sử dụng Protobuf. Dữ liệu được nén thành dạng nhị phân siêu nhỏ gọn, giúp việc đồng bộ hóa hàng ngàn giao dịch qua mạng diễn ra chỉ trong chớp mắt.


📊 4. Workflow: Luồng dữ liệu và Đồng bộ hóa

Dưới đây là sơ đồ trình tự mô tả cách một giao dịch được xử lý và đồng bộ hóa giữa các thiết bị:

image.png


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

Tiêu chí Actual Budget Mint / YNAB (Cloud)
Quyền sở hữu dữ liệu Người dùng nắm giữ 100% Nhà cung cấp nắm giữ
Tốc độ phản hồi Cực nhanh (Local DB) Phụ thuộc vào Network
Bảo mật Mã hóa đầu cuối (E2EE) Mã hóa trên Server
Hoạt động Offline Hoàn hảo Rất hạn chế
Khả năng mở rộng Có API mạnh mẽ cho Scripting Hạn chế tùy theo gói dịch vụ

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

Actual Budget là minh chứng cho việc ứng dụng Web có thể mạnh mẽ và bảo mật như ứng dụng Native nếu có một kiến trúc đúng đắn. Việc làm chủ CRDT để xử lý đồng bộ và xây dựng một Headless Core linh hoạt giúp dự án này vượt xa các đối thủ thương mại về mặt kỹ thuật. Đối với các lập trình viên, đây là dự án tuyệt vời để nghiên cứu về hệ thống Distributed Systems (hệ thống phân tán) thu nhỏ và cách tối ưu hóa hiệu suất với SQLite.


Hy vọng bản phân tích chuyên sâu này mang lại cho bạn những kiến thức bổ ích về kiến trúc phần mềm hiện đại. Đừng quên UpvoteFollow mình để đón xem những dự án kỹ thuật đỉnh cao tiếp theo!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.