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 });
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 });
});