Mở đầu
Trong kỷ nguyên số, dữ liệu không chỉ được sinh ra liên tục mà còn phải được xử lý và hiển thị gần như tức thì để hỗ trợ ra quyết định nhanh chóng. Tuy nhiên, xây dựng một hệ thống lưu trữ và phân tích thời gian thực từ đầu thường đòi hỏi nhiều thành phần phức tạp: message broker, stream processor, time-series database, và công cụ trực quan hóa. Điều này có thể khiến các dự án nhỏ hoặc startup gặp khó khăn về chi phí và độ phức tạp.
May mắn thay, với sự phát triển của các nền tảng Backend-as-a-Service hiện đại, chúng ta có thể rút gọn toàn bộ quy trình này xuống chỉ còn hai thành phần chính: Supabase và Grafana. Supabase cung cấp cơ sở dữ liệu PostgreSQL mạnh mẽ với khả năng lưu trữ và truy vấn thời gian thực, trong khi Grafana biến dữ liệu đó thành các dashboard trực quan, có thể tùy biến cao. Bài viết này sẽ hướng dẫn chi tiết cách kết hợp hai công cụ này để xây dựng một hệ thống thời gian thực hoàn chỉnh.
Vì sao chọn Supabase và Grafana?
Supabase không chỉ là một dịch vụ PostgreSQL được host sẵn, nó còn tích hợp sẵn WebSocket và Row Level Security (RLS), cho phép bạn đẩy dữ liệu vào cơ sở dữ liệu và lập tức nhận được notification thời gian thực khi có thay đổi. Điều này rất phù hợp với các trường hợp như dashboard IoT, theo dõi hoạt động người dùng, hoặc hệ thống giám sát.
Grafana, mặt khác, là một công cụ trực quan hóa dữ liệu cực kỳ phổ biến, hỗ trợ nhiều loại datasource khác nhau, trong đó có PostgreSQL. Với Grafana, bạn có thể tạo ra các biểu đồ, gauge, heatmap, và nhiều dạng trực quan khác, cập nhật liên tục khi dữ liệu thay đổi.
Kết hợp cả hai, bạn có một giải pháp hoàn chỉnh: Supabase làm "engine" lưu trữ và phát dữ liệu thời gian thực, Grafana làm "mặt tiền" hiển thị và cảnh báo.
Kiến trúc hệ thống
Về mặt kiến trúc, hệ thống sẽ vận hành như sau:
1. Nguồn dữ liệu (có thể là IoT device, web app, mobile app) gửi dữ liệu lên Supabase thông qua REST API hoặc WebSocket. 2. Supabase lưu trữ dữ liệu vào PostgreSQL, đồng thời kích hoạt realtime subscription nếu có client lắng nghe. 3. Grafana kết nối đến Supabase qua datasource PostgreSQL, thực hiện truy vấn và tự động refresh dashboard theo interval hoặc khi có dữ liệu mới.
Vì Grafana không hỗ trợ WebSocket trực tiếp, chúng ta sẽ dựa vào tính năng auto-refresh của panel hoặc sử dụng PostgreSQL LISTEN/NOTIFY để trigger reload.
Thiết lập Supabase
Đầu tiên, tạo một project mới trên Supabase Dashboard. Sau khi project được khởi tạo, bạn sẽ có một database URL và một API key.
Tiếp theo, tạo một table để lưu trữ dữ liệu thời gian thực. Ví dụ, với ứng dụng đo nhiệt độ:
CREATE TABLE IF NOT EXISTS readings (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
sensor_id TEXT NOT NULL,
temperature DOUBLE PRECISION NOT NULL,
humidity DOUBLE PRECISION,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
Bật Row Level Security và tạo policy cho phép ứng dụng của bạn insert dữ liệu:
ALTER TABLE readings ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can insert own readings." ON readings
FOR INSERT WITH CHECK (auth.uid() = 'your-user-id');
Nếu bạn muốn client lắng nghe thay đổi, có thể tạo một function để broadcast notification:
CREATE OR REPLACE FUNCTION notify_new_reading()
RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify('readings_channel', row_to_json(NEW)::text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER notify_new_reading_trigger
AFTER INSERT ON readings
FOR EACH ROW EXECUTE FUNCTION notify_new_reading();
Quảng cáo
300x250 In-Content Advertisement
Với setup này, mỗi khi có bản ghi mới được insert, PostgreSQL sẽ gửi notification đến channel readings_channel.
Kết nối Grafana với Supabase
Trong Grafana, thêm một datasource PostgreSQL:
- Host: your-project.supabase.co
- Database: postgres
- User: postgres
- Password: lấy từ Dashboard > Settings > Database
- SSL Mode: require
Test kết nối để đảm bảo Grafana có thể truy vấn được dữ liệu từ Supabase.
Tạo một dashboard mới và thêm panel. Ví dụ, để hiển thị nhiệt độ trung bình trong 5 phút gần nhất:
SELECT
time_bucket('5 minutes', created_at) AS time,
AVG(temperature) AS avg_temp
FROM readings
WHERE created_at > now() - interval '1 hour'
GROUP BY time
ORDER BY time;
Set Refresh interval của panel thành 5s hoặc 10s để dashboard tự động cập nhật. Nếu muốn realtime hơn nữa, bạn có thể kết hợp với cơ chế LISTEN/NOTIFY, tuy nhiên điều này đòi hỏi plugin hoặc script trung gian để trigger reload Grafana.
Mở rộng và tối ưu
Để hệ thống vận hành trơn tru khi dữ liệu lớn, hãy cân nhắc:
- Partitioning: Tạo partition theo tháng hoặc ngày cho table readings để tăng tốc độ truy vấn.
- Indexing: Index trên created_at và sensor_id giúp filter nhanh hơn.
- Materialized views: Với các metric thường dùng, tạo view vật lý sẽ giảm tải cho database.
Ngoài ra, bạn có thể kết hợp Supabase Storage để lưu trữ file kèm theo metadata, hoặc sử dụng Edge Functions để preprocess dữ liệu trước khi insert.
Kết luận
Với Supabase và Grafana, việc xây dựng một hệ thống lưu trữ và phân tích dữ liệu thời gian thực trở nên đơn giản hơn bao giờ hết. Supabase lo việc lưu trữ, realtime notification, và bảo mật; Grafana lo việc trực quan hóa và cảnh báo. Cả hai đều có thể scale tốt, hỗ trợ open source, và dễ tích hợp.
Dù bạn đang xây dựng IoT dashboard, hệ thống giám sát ứng dụng, hay tracking user behavior, stack này đều có thể đáp ứng với chi phí hợp lý và tốc độ phát triển nhanh. Hãy bắt đầu từ một project nhỏ, trải nghiệm khả năng realtime của Supabase, và để Grafana biến dữ liệu thành những câu chuyện trực quan sinh động.