实时消息(Realtime)

Supabase Realtime提供基于WebSocket的实时通信能力。您可以通过单一连接实现实时数据同步(Postgres Changes)、客户端消息广播(Broadcast)以及用户状态跟踪(Presence)三大核心功能。所有功能均由supabase-js客户端库统一管理,自动处理连接、重连及权限控制,无需手动操作WebSocket协议。

Postgres Changes

Postgres Changes允许客户端监听数据库表的INSERTUPDATEDELETE操作,从而实时获取数据变更。该功能依赖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事件来接收,从而实现点对点或群组通信。

  1. 创建频道时,在配置中设置并启用Broadcast。

    const channel = supabase.channel('chat-room', {
      config: {
        broadcast: { self: false },
        presence: false
      }
    });
    
  2. 发送广播消息。

    await channel.send({
      type: 'broadcast',
      event: 'message',
      payload: { text: 'Hello' }
    });
    

Presence

Presence用于跟踪频道内用户的在线状态,例如“在线”、“离开”或“打字中”。加入频道后,客户端可以调用track()方法来注册自己的状态。您可以通过channel.presenceState()获取当前在线的用户列表,并监听syncpresence_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