Supabase Realtime提供基于WebSocket的实时通信能力。您可以通过单一连接实现实时数据同步(Postgres Changes)、客户端消息广播(Broadcast)以及用户状态跟踪(Presence)三大核心功能。所有功能均由supabase-js
客户端库统一管理,自动处理连接、重连及权限控制,无需手动操作WebSocket协议。
Postgres Changes
Postgres Changes允许客户端监听数据库表的INSERT
、UPDATE
和DELETE
操作,从而实时获取数据变更。该功能依赖PostgreSQL的逻辑复制机制,要求监听的表必须具备主键。
在使用该功能之前,您需要在RDS Supabase项目中为目标表启用Realtime。
例如,监听public.messages表的插入操作,并通过supabase-js
客户端订阅变更事件。
const channel = supabase
.channel('db-changes')
.on('postgres_changes', {
event: 'INSERT',
schema: 'public',
table: 'messages'
}, (payload) => {
console.log('新消息:', payload.new);
})
.subscribe();
Broadcast
Broadcast模式支持客户端之间发送低延迟消息,适用于聊天、通知等场景。消息仅发送给当前在线的客户端,不会被持久化。发送方通过channel.send()
推送消息,而其他客户端则通过监听broadcast
事件来接收,从而实现点对点或群组通信。
创建频道时,在配置中设置并启用Broadcast。
const channel = supabase.channel('chat-room', { config: { broadcast: { self: false }, presence: false } });
发送广播消息。
await channel.send({ type: 'broadcast', event: 'message', payload: { text: 'Hello' } });
Presence
Presence用于跟踪频道内用户的在线状态,例如“在线”、“离开”或“打字中”。加入频道后,客户端可以调用track()
方法来注册自己的状态。您可以通过channel.presenceState()
获取当前在线的用户列表,并监听sync
和presence_diff
,以实现状态的同步与差异更新处理。
启用Presence并注册状态:
const channel = supabase.channel('room:lobby', {
config: { presence: { key: 'user1' } }
});
channel.subscribe(async (status) => {
if (status === 'SUBSCRIBED') {
await channel.track({ online_at: new Date().toISOString(), state: 'online' });
}
});
相关文档
了解Supabase实时消息的更多信息,请参见Realtime。
该文章对您有帮助吗?