Lưu trữ và Phân tích Dữ liệu Thời gian Thực với Supabase và Grafana

06/04/2026 P T P Chung 9 phút đọc 0 bình luận

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_atsensor_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.

Quảng cáo

728x90 Bottom Advertisement

Thay thế bằng mã Google AdSense

Chia sẻ bài viết

Facebook Twitter

Bình luận

Chia sẻ ý kiến của bạn về bài viết này

Viết bình luận

Bình luận của bạn sẽ được kiểm duyệt trước khi hiển thị

Chưa có bình luận nào

Hãy là người đầu tiên bình luận về bài viết này!