[Open source] #9 Rybbit: Giải pháp Analytics và Uptime Monitoring tự vận hành với kiến trúc Hybrid Database
Trong bối cảnh các quy định về quyền riêng tư như GDPR ngày càng siết chặt, việc phụ thuộc vào các nền tảng phân tích dữ liệu bên thứ ba như Google Analytics đang đặt ra nhiều thách thức cho lập trình viên. Rybbit nổi lên như một giải pháp thay thế toàn diện, kết hợp giữa Web Analytics, Session Replay và Uptime Monitoring trong một hệ sinh thái duy nhất.
📌 Tổng quan về dự án
Rybbit là nền tảng phân tích dữ liệu web mã nguồn mở theo triết lý Privacy-first. Điểm nổi bật của dự án là khả năng vận hành mà không cần sử dụng cookie, đồng thời tích hợp sâu các công cụ giám sát hiệu năng và lỗi hệ thống.
- Mã nguồn: github.com/rybbit-io/rybbit
- Tech Stack: Next.js 15, Fastify, Drizzle ORM, Tailwind CSS v4.
- Hệ quản trị cơ sở dữ liệu: PostgreSQL 17 kết hợp ClickHouse.
🏗️ Phân tích kiến trúc kỹ thuật
1. Kiến trúc Database lai (Hybrid OLAP & OLTP)
Đây là "linh hồn" giúp Rybbit xử lý được lượng dữ liệu khổng lồ:
- PostgreSQL 17 (OLTP): Đóng vai trò lưu trữ các dữ liệu quan hệ cần tính nhất quán cao (User profile, dự án, cấu hình site).
- ClickHouse (OLAP): Chuyên trách xử lý các truy vấn phân tích (Aggregation) trên hàng triệu sự kiện (events). Nhờ cấu trúc lưu trữ dạng cột (Columnar Storage), ClickHouse cho phép trích xuất báo cáo Web Vitals và Pageviews với tốc độ mili giây, vượt xa giới hạn của các RDBMS truyền thống.
2. Modern Tech Stack & Performance
Dự án tận dụng tối đa các công nghệ mới nhất để tối ưu hóa trải nghiệm:
- Next.js 15 & React 19: Sử dụng App Router và các tính năng render mới nhất giúp Dashboard hoạt động mượt mà.
- Fastify Backend: Đảm bảo luồng nhận dữ liệu (Ingestion) có độ trễ thấp nhất.
- rrweb Integration: Cho phép ghi lại và phát lại phiên làm việc của người dùng (Session Replay) để phân tích hành vi và debug lỗi UX mà không làm giảm hiệu năng trang web.
🔄 Luồng dữ liệu và Vận hành (Workflow)
Sơ đồ dưới đây mô tả quá trình từ khi thu thập sự kiện thô cho đến khi hiển thị báo cáo trên Dashboard:

1. Giai đoạn Thu thập & Bảo mật (Ingestion Phase)
- Bước 1 & 2 (Lightweight Beacon): Rybbit Script (
script.js) được thiết kế cực kỳ nhỏ gọn để không ảnh hưởng đến chỉ số TBT (Total Blocking Time) của website khách hàng.- Nó không chỉ gửi Pageview đơn thuần mà còn thu thập Core Web Vitals (LCP, FID, CLS) thông qua các trình lắng nghe sự kiện của trình duyệt.
- Dữ liệu được gửi đi dưới dạng "Beacon" hoặc dùng Fetch API với chế độ
keepalive: trueđể đảm bảo dữ liệu không bị mất ngay cả khi người dùng đóng trình duyệt đột ngột.
2. Giai đoạn Xử lý & Làm giàu dữ liệu (Processing & Enrichment)
- Bước 3 (The Fastify Engine): Tại sao lại là Fastify? Vì Rybbit cần xử lý hàng nghìn request mỗi giây mà không được gây nghẽn (Low Latency).
- Metadata Enrichment: Khi request đến, Backend không lưu ngay. Nó thực hiện "Enrichment" (Làm giàu dữ liệu): Tra cứu GeoIP (Country, City) dựa trên địa chỉ IP, phân tích User-Agent để xác định phiên bản OS/Browser chính xác.
- Privacy-first Anonymization: Trước khi lưu, địa chỉ IP được băm (hash) kèm muối (salt) để đảm bảo không thể truy ngược danh tính người dùng, tuân thủ nghiêm ngặt GDPR.
3. Chiến lược Lưu trữ Lai (Hybrid Storage Strategy)
Đây là "linh hồn" của kiến trúc Rybbit, giải quyết bài toán quy mô dữ liệu.
- PostgreSQL (Metadata - OLTP): Chỉ lưu trữ các thông tin cấu hình như: Ai là chủ website? Website đó tên là gì? Các filter đã lưu là gì? Postgres đảm bảo tính toàn vẹn dữ liệu (ACID) cho các nghiệp vụ quản lý.
- ClickHouse (Event Data - OLAP): Mọi sự kiện thô (raw events) được đẩy vào ClickHouse.
- In-Memory Buffer: ClickHouse của Rybbit được cấu hình với cơ chế Asynchronous Inserts. Dữ liệu không ghi ngay xuống đĩa cứng mà được gom vào một bộ đệm trong RAM (Buffer). Khi đạt đủ số lượng hoặc thời gian, nó sẽ được ghi theo từng khối (Batch) cực lớn. Điều này giúp hệ thống chịu được tải cực cao (High Throughput).
4. Giai đoạn Truy vấn & Trực quan hóa (Query & Visualization)
- Bước 4 - 6 (SQL Aggregation): Khi người dùng mở Dashboard, Next.js gửi yêu cầu truy vấn kèm theo các bộ lọc phức tạp (ví dụ: "Xem người dùng dùng Chrome ở Việt Nam trong 30 ngày qua").
- Backend sẽ chuyển đổi các bộ lọc này thành các câu lệnh SQL tối ưu cho ClickHouse (sử dụng các hàm như
uniqCombinedđể đếm User cực nhanh thay vìCOUNT(DISTINCT)truyền thống). - ClickHouse thực hiện truy vấn trên cấu trúc dữ liệu dạng cột (Columnar Storage), chỉ đọc những cột cần thiết, giúp tốc độ phản hồi nhanh gấp hàng trăm lần so với Postgres trên cùng một lượng dữ liệu.
- Backend sẽ chuyển đổi các bộ lọc này thành các câu lệnh SQL tối ưu cho ClickHouse (sử dụng các hàm như
5. Trải nghiệm người dùng (UX)
- Bước 7 & 8 (Nivo & Real-time Update): Dữ liệu trả về được render qua thư viện Nivo (D3.js-based). Nhờ việc query trực tiếp vào ClickHouse, Dashboard của Rybbit có thể hiển thị dữ liệu Live User Count gần như tức thời, mang lại cảm giác "Real-time" thực thụ cho người dùng.
🛠️ Tại sao kiến trúc này lại "Đỉnh"?
- Scale-out tốt: Bạn có thể scale riêng server ClickHouse khi số lượng website theo dõi tăng lên mà không ảnh hưởng đến server Backend.
- Tiết kiệm tài nguyên: Việc dùng ClickHouse giúp bạn lưu trữ hàng tỷ bản ghi trên một cấu hình server trung bình — điều mà các nền tảng dùng Postgres hay MySQL thuần túy sẽ "gục ngã" khi dữ liệu phình to.
- Tích hợp sâu: Nhờ Monorepo, mã nguồn giữa Client, Server và Monitor Agent chia sẻ chung các định nghĩa Type (TypeScript), giúp giảm thiểu lỗi trong quá trình phát triển và bảo trì.
Lời kết cho phần phân tích: Luồng hoạt động này cho thấy Rybbit không chỉ "đẹp mã" mà còn cực kỳ "có võ" bên trong. Đây là một hệ thống dữ liệu hiện đại, được xây dựng bài bản để sẵn sàng cho các website có lưu lượng truy cập từ trung bình đến lớn. Kỹ thuật đáng chú ý: Việc sử dụng Asynchronous Inserts vào ClickHouse giúp Backend chịu được tải cực lớn (High Throughput) mà không bị nghẽn cổ chai khi có hàng nghìn người dùng truy cập website cùng lúc.
⚖️ So sánh với các giải pháp hiện nay
| Đặc tính | Rybbit | Google Analytics | Umami / Plausible |
|---|---|---|---|
| Bảo mật dữ liệu | Tuyệt đối (Self-host) | Thấp (Dữ liệu bên thứ 3) | Tuyệt đối |
| Cơ chế định danh | Không Cookie | Có Cookie | Không Cookie |
| Tính năng tích hợp | Analytics + Replay + Monitor | Chỉ Analytics | Chỉ Analytics |
| Tốc độ xử lý | Rất nhanh (ClickHouse) | Có độ trễ nhất định | Nhanh |
| Chi phí | Miễn phí hoàn toàn | Miễn phí (đổi lấy dữ liệu) | Có phí/Miễn phí |
✅ Kết luận
Rybbit là một ví dụ điển hình cho việc ứng dụng kiến trúc Hybrid Database để giải quyết bài toán Big Data trong Web Analytics. Với sự kết hợp giữa Fastify cho tốc độ nhận dữ liệu và ClickHouse cho sức mạnh phân tích, đây là một dự án mã nguồn mở cực kỳ tiềm năng cho các doanh nghiệp muốn tự chủ hoàn toàn về dữ liệu người dùng.
Hy vọng phân tích này mang lại cho bạn thêm một góc nhìn về cách xây dựng hệ thống Analytics hiện đại. Nếu thấy bài viết hữu ích, hãy để lại Upvote hoặc thảo luận cùng mình ở phần bình luận nhé!
Bài viết nằm trong series tìm hiểu các dự án Open Source tiềm năng.
All rights reserved