Tạo Hệ Thống Notification Push Với Supabase và Firebase Cloud Messaging

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

Tại sao nên xây dựng hệ thống notification push?

Trong thời đại ứng dụng di động và web phát triển mạnh mẽ, việc duy trì kết nối với người dùng là yếu tố then chốt. Notification push không chỉ giúp gửi tin nhắn tức thời, mà còn tăng khả năng tương tác, cải thiện trải nghiệm và thúc đẩy hành vi mong muốn. Tuy nhiên, xây dựng một hệ thống notification đáng tin cậy, mở rộng và tiết kiệm chi phí không phải là điều đơn giản.

Giới thiệu Supabase và Firebase Cloud Messaging (FCM)

Supabase là một nền tảng Backend-as-a-Service (BaaS) mã nguồn mở, cung cấp cơ sở dữ liệu PostgreSQL, xác thực, lưu trữ, và cả Realtime. Firebase Cloud Messaging (FCM) là dịch vụ push notification của Google, cho phép gửi tin nhắn đến thiết bị di động, web, và backend một cách nhanh chóng và đáng tin cậy.

Kết hợp Supabase với FCM mang lại lợi ích kép: Supabase quản lý dữ liệu người dùng, subscription, và logic ứng dụng, trong khi FCM đảm nhiệm việc gửi notification đến hàng triệu thiết bị.

Kiến trúc hệ thống notification push

1. Cấu trúc dữ liệu trong Supabase

Để quản lý notification, ta cần ba bảng chính:

- users: lưu thông tin người dùng (id, email, name). - devices: lưu device token, loại thiết bị (android/ios/web), và user_id để liên kết với người dùng. - notifications: log các notification đã gửi (title, body, payload, created_at).

2. Quy trình đăng ký device token

Khi người dùng đăng nhập vào ứng dụng, client sẽ: - Lấy device token từ FCM (đối với web, dùng firebase.messaging.getToken(); đối với mobile, dùng SDK tương ứng). - Gửi device token và user_id về Supabase để lưu vào bảng devices. - Nếu người dùng đăng xuất hoặc xóa app, token sẽ bị xóa hoặc đánh dấu không hoạt động.

3. Gửi notification

Khi cần gửi notification: - Backend (hoặc cloud function) xác định danh sách device token cần gửi (theo user, nhóm, hoặc toàn bộ). - Gọi API FCM với device tokens và nội dung notification. - FCM sẽ phân phối tin nhắn đến từng thiết bị.

Triển khai chi tiết

1. Thiết lập Supabase

Tạo project mới trên Supabase, thiết lập ba bảng như đã đề cập. Sử dụng Row Level Security (RLS) để đảm bảo chỉ user hợp lệ mới có thể thêm/sửa device token của mình.

-- Example: devices table
CREATE TABLE devices (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  user_id UUID REFERENCES users(id) ON DELETE CASCADE,
  token TEXT NOT NULL,
  platform TEXT NOT NULL, -- 'android', 'ios', 'web'
  created_at TIMESTAMP DEFAULT now(),
  UNIQUE(user_id, token)
);

2. Thiết lập Firebase và lấy server key

Tạo project Firebase, kích hoạt FCM. Lưu ý: nếu dùng Supabase Functions, cần lưu server key vào biến môi trường, không bao giờ hardcode.

3. Viết function gửi notification

Sử dụng Supabase Edge Functions hoặc cloud function bên ngoài:

import { serve } from 'https://deno.land/[email protected]/http/server.ts';
import { FCM } from 'https://deno.land/x/[email protected]/mod.ts';

const fcm = new FCM(Deno.env.get('FCM_SERVER_KEY'));

serve(async (req) => { const { title, body, userIds } = await req.json();

// Lấy device tokens từ Supabase const { data, error } = await supabase .from('devices') .select('token') .in('user_id', userIds);

if (error) return new Response(error.detail, { status: 500 });

Quảng cáo

300x250 In-Content Advertisement

const tokens = data.map(d => d.token); const message = { tokens: tokens, notification: { title, body } };

const response = await fcm.send(message); return new Response(JSON.stringify(response), { status: 200 }); });

4. Client SDK - đăng ký và nhận notification

Web (JavaScript/TypeScript):
import { getMessaging, getToken, onMessage } from 'firebase/messaging';
import { initializeApp } from 'firebase/app';

const firebaseConfig = { / config / }; const app = initializeApp(firebaseConfig); const messaging = getMessaging(app);

// Lấy token const token = await getToken(messaging, { vapidKey: 'YOUR_WEB_PUSH_CERT' });

// Subscribe const res = await fetch('/api/register-device', { method: 'POST', body: JSON.stringify({ token, userId }) });

Mobile (React Native):
import messaging from '@react-native-firebase/messaging';

const token = await messaging().getToken(); // Gửi token về backend

Xử lý lỗi và tối ưu

- Token không hợp lệ: FCM sẽ trả về lỗi, cần xóa token khỏi database. - Rate limiting: FCM giới hạn số lượng message mỗi ngày, cần theo dõi quota. - Offline: FCM tự động queue message nếu device offline. - Unsubscribe: Cho phép user tắt notification trong settings.

Bảo mật và quyền riêng tư

- Không lưu device token dưới dạng plain text nếu có yêu cầu bảo mật cao. - Tuân thủ GDPR: cho phép user xóa dữ liệu, minh bạch về việc thu thập. - Sử dụng HTTPS, xác thực request từ client.

Mở rộng và giám sát

- Dùng Supabase Realtime để gửi notification đến web clients đang online. - Log mọi request gửi notification để debug và thống kê. - Dùng cron job hoặc cloud scheduler để gửi hàng loạt vào khung giờ phù hợp.

Kết luận

Xây dựng hệ thống notification push với Supabase và Firebase Cloud Messaging là giải pháp hiệu quả, dễ mở rộng và tiết kiệm chi phí. Bằng cách tách biệt logic nghiệp vụ (Supabase) và delivery (FCM), bạn có thể quản lý người dùng, subscription, và nội dung notification một cách linh hoạt. Điều quan trọng là luôn đặt bảo mật, quyền riêng tư, và trải nghiệm người dùng lên hàng đầu.

Với kiến trúc này, bạn có thể tự tin triển khai hệ thống notification mạnh mẽ, sẵn sàng mở rộng theo quy mô ứng dụ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!