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.