Ra mắt trên HN: Triplit – cơ sở dữ liệu đồng bộ mã nguồn mở chạy trên máy chủ và máy khách
(github.com/aspen-cloud)Tổng quan về Triplit
Triplit là cơ sở dữ liệu mã nguồn mở đồng bộ dữ liệu theo thời gian thực giữa máy chủ và trình duyệt. Nó được cung cấp dưới dạng gói Typescript, lưu trữ dữ liệu trên máy chủ và đồng bộ thông minh tới máy khách.
- Đồng bộ thời gian thực: cung cấp cập nhật tăng dần ở mức thuộc tính và giải quyết xung đột
- Bộ nhớ đệm cục bộ: vận hành như cơ sở dữ liệu phía máy khách
- Lưu trữ bền vững phía máy chủ: bao gồm bảng điều khiển quản trị
- Nhà cung cấp lưu trữ dạng plugin: hỗ trợ SQLite, IndexedDB, LevelDB, Memory, v.v.
- Cập nhật lạc quan: mang lại tương tác nhanh
- Truy vấn quan hệ: hỗ trợ mô hình dữ liệu phức tạp
- Chế độ ngoại tuyến: tự động kết nối lại và đảm bảo tính nhất quán
- Quản lý hoàn tác và thử lại: xử lý khi cập nhật thất bại
- Schema: cung cấp an toàn dữ liệu và tự động hoàn thành Typescript
- Quản lý quyền: thực thi quyền đọc và ghi trên máy chủ
- Cộng tác/nhiều người chơi: được vận hành bằng CRDTs
- Độ trễ thấp: sử dụng delta patch để giảm tối thiểu lưu lượng mạng
- API đơn giản: hỗ trợ truy vấn và biến đổi dữ liệu trong Javascript và React
- Mã nguồn mở hoàn toàn
Tổng quan monorepo
triplit/packages bao gồm nhiều dự án khác nhau vận hành Triplit:
- TriplitDB: chạy được trong mọi môi trường JS như trình duyệt, Node, Deno, React Native, v.v., và cung cấp các truy vấn nhanh, cập nhật theo thời gian thực đồng thời duy trì tính nhất quán giữa nhiều tác giả trên mạng
- Client: thư viện trình duyệt tương tác với TriplitDB cục bộ và từ xa
- CLI: cung cấp lệnh cho việc scaffold dự án, chạy môi trường phát triển full-stack, migration máy chủ, v.v.
- React: binding React cho @triplit/client
- Svelte: binding Svelte cho @triplit/client
- Console: ứng dụng quản lý schema, xem và biến đổi dữ liệu của dự án Triplit
- Server: máy chủ Node để đồng bộ dữ liệu giữa các máy khách Triplit
- Server-core: thư viện độc lập giao thức để xây dựng máy chủ chạy Triplit
- Docs: tài liệu Triplit được xây dựng bằng Nextra
- Types: kiểu dùng chung cho nhiều dự án Triplit
- UI: các thành phần UI dùng chung cho dự án frontend Triplit được xây dựng bằng shadcn
Bắt đầu nhanh
Bắt đầu dự án mới:
npm create triplit-app@latest my-app
Thêm dependency vào dự án hiện có:
npm install --save-dev @triplit/cli
npm run triplit init
Định nghĩa schema (my-app/triplit/schema.ts):
import { Schema as S, ClientSchema } from '@triplit/client';
export const schema = {
todos: {
schema: S.Schema({
id: S.Id(),
text: S.String(),
completed: S.Boolean({ default: false }),
}),
},
} satisfies ClientSchema;
Khởi động máy chủ đồng bộ phát triển của Triplit:
npm run triplit dev
Thiết lập biến môi trường (tệp .env):
VITE_TRIPLIT_SERVER_URL=http://localhost:6543
VITE_TRIPLIT_TOKEN=copied-in-from-triplit-dev
Định nghĩa truy vấn trong ứng dụng (ví dụ React):
import { TriplitClient } from '@triplit/client';
import { useQuery } from '@triplit/react';
import { schema } from '../triplit/schema';
const client = new TriplitClient({
schema,
serverUrl: import.meta.env.VITE_TRIPLIT_SERVER_URL,
token: import.meta.env.VITE_TRIPLIT_TOKEN,
});
function App() {
const { results: todos } = useQuery(client.query('todos'));
return (
<div>
{Array.from(todos.values()).map((todo) => (
<div key={todo.id}>
<input
type="checkbox"
checked={todo.completed}
onChange={() =>
client.update('todos', todo.id, (todo) => ({
todo.completed = !todo.completed,
}))
}
/>
{todo.text}
</div>
))}
</div>
);
}
Khởi động ứng dụng, mở tab trình duyệt khác và kiểm tra việc đồng bộ dữ liệu theo thời gian thực.
Ý kiến của GN⁺
- Triplit kết hợp đồng bộ thời gian thực với bộ nhớ đệm cục bộ để mang lại trải nghiệm người dùng nhanh và nhất quán.
- Hỗ trợ nhiều nhà cung cấp lưu trữ, cho phép quản lý dữ liệu linh hoạt.
- Chế độ ngoại tuyến và tính năng tự động kết nối lại giúp duy trì tính nhất quán dữ liệu ngay cả khi mạng không ổn định.
- API đơn giản cùng hỗ trợ nhiều framework khiến nó thân thiện với nhà phát triển.
- Tuy nhiên, việc thiết lập ban đầu và quản lý biến môi trường có thể hơi phức tạp.
1 bình luận
Ý kiến trên Hacker News
Chia sẻ trải nghiệm sử dụng Triplit: Đang dùng Triplit trong một dự án và mô hình dữ liệu của nó rất phù hợp với kiểu phân tán (P2P). Tuy nhiên, việc tạo token xác thực phía máy chủ và độ biểu đạt còn hạn chế của ngôn ngữ truy vấn là điều đáng tiếc.
So sánh với Evolu: Điểm khác biệt giữa Triplit và Evolu là tính năng
.subscribe()của Triplit, các tính năng truy vấn nâng cao của Evolu (dựa trên SQL), và loại cơ sở dữ liệu được dùng trong trình duyệt cũng khác nhau.Đồng bộ ngoại tuyến và tiến hóa schema: Thắc mắc cách các cơ sở dữ liệu dùng giao thức đồng bộ ngoại tuyến giải quyết vấn đề tiến hóa schema khi phiên bản client khác nhau.
Thắc mắc về việc client ghi trực tiếp vào cơ sở dữ liệu: Không hiểu các ứng dụng cho phép client ghi trực tiếp vào cơ sở dữ liệu. Cũng có cùng thắc mắc với Supabase và Firestore.
Quản lý thiết lập người dùng bằng Triplit: Dùng Triplit để quản lý thiết lập người dùng, giúp ứng dụng vẫn hoạt động tốt ngay cả khi ngoại tuyến. Tốc độ phản hồi nhanh của đội ngũ hỗ trợ gây ấn tượng.
Lý do chọn giấy phép AGPL: Thắc mắc vì sao Triplit chọn giấy phép AGPL.
Cách tiếp cận local-first: Đang dùng cách tiếp cận local-first cho ứng dụng di động và muốn biết vì sao Triplit cung cấp giải pháp đồng bộ client-server khi so với các giải pháp khác.
Yêu cầu Rust bindings: Nếu có thêm Rust bindings thì có thể dùng cùng Tauri, điều này sẽ hữu ích cho việc phát triển ứng dụng offline-first.
Trải nghiệm dùng Triplit trên React Native: Đang dùng Triplit trong ứng dụng React Native và đánh giá cao ngôn ngữ truy vấn, hỗ trợ TypeScript, hỗ trợ ngoại tuyến và hỗ trợ React Native. Việc mã nguồn mở và có thể tự lưu trữ cũng là ưu điểm.
Tương lai của phát triển ứng dụng: Triplit mang lại cảm giác như tương lai của việc phát triển ứng dụng, nhưng muốn biết suy nghĩ về việc so sánh với RethinkDB và lý do họ thất bại.
Khả năng kết hợp MongoDB và Triplit: Thắc mắc liệu có thể dùng MongoDB ở phía máy chủ và Triplit ở phía React hay không, hay phải dùng Triplit như một cơ sở dữ liệu mới.