通道只是一个名称。 无需预配置。

频道在有订阅者时自动存在,最后一个连接离开后自动消失。频道名称决定类型:public 供任何访客读取,private 限定于某个客户,presence 用于带成员列表的房间,cache 前缀则为后加入者提供即时可用的状态。

channels.ts
4 subscribed
const bird = new BirdRealtime({ appKey: APP_KEY, region: "us1" });

// Public: anyone holding the app key can subscribe.
const scores = bird.subscribe("match-42");

// Private: your backend signs every subscription.
const order = bird.subscribe("private-order-ord_123");

// Presence: private, plus an identity the room can see.
const room = bird.subscribe("presence-room-42");

// Cache: the latest event replays to whoever joins next.
const build = bird.subscribe("cache-build-8821");

build.bind("bird:cache_miss", () => showSkeleton());

前缀即配置。

无需维护频道注册表。

频道是 Bird Realtime API 的寻址模型。你无需创建频道:只需订阅一个名称,名称的前三个字符告诉边缘节点如何处理它。没有前缀的名称是公开的。private- 要求你的后端审批每个订阅。presence- 在此基础上附加身份信息。private-encrypted- 使用 Bird 永远不会持有的密钥加密载荷。名称最长 164 个字符,区分大小写,是频道中唯一需要你仔细考虑的部分,因为公开名称对持有 app key 的任何人可见。

五种房间类型。

相同协议、相同客户端、相同发布调用。区别只在名称。

  1. 01

    公开频道。

    无需授权端点,无需注册。持有 app key 的任何人都可以订阅,适用于构建结果、实时比分、航班信息或状态页,不适用于限定到单个客户的内容。名称中不要包含标识符:orders 不暴露任何信息,orders-user-4821 则暴露了用户 4821 的存在。

  2. 02

    私有频道。

    以 private- 开头的名称会将订阅路由到你自己的端点,该端点检查会话并使用 app secret 对连接 id 和频道名称进行签名。你的规则,你的会话,你的 403。边缘节点验证签名,未通过验证的请求无法到达频道。

  3. 03

    存在感知频道。

    在私有频道授权的基础上附加身份信息,每个订阅者都能获取成员列表,并收到加入和离开的通知。这是唯一带有成员名册的频道类型。

  4. 04

    加密频道。

    private-encrypted- 频道的载荷由你的服务器使用 32 字节主密钥加密,该密钥永远不会出现在 Realtime 请求中。边缘节点及其与浏览器之间的一切只能看到密文。频道名称和事件名称保持明文,因此选择不会泄露保护内容的名称。

  5. 05

    缓存频道。

    在名称前(任何类型前缀之后)加上 cache-,频道会记住最近一次通过 API 发布的事件,并将其回放给每个新订阅者。订阅即充当初始状态获取。两个值得在设计时考虑的限制:仅保留最近一条事件,且它可能在 30 分钟上限之前过期,因此每次载荷中放入完整状态,并通过 cache-miss webhook 重新填充,而不是假设缓存是热的。

一次发布,最多一百个频道。

发布是从你的服务器发出的普通 REST 调用。在一个请求中指定最多 100 个频道,边缘节点会将事件扇出到所有频道。一个批次可携带最多 10 个不相关事件,每个发送到各自的频道。将操作客户端的连接 id 作为 exclude_connection_id 传入,已在本地应用变更的标签页会被跳过。在 include 中请求连接数或成员数,响应会告诉你发布时每个频道的状态。使用相同的幂等键重试,不会重复投递。

publish.ts
200 · accepted
// One event, up to 100 channels, one request.
const result = await bird.realtime.publish(APP_ID, {
  event: "score-updated",
  channels: ["match-42", "cache-match-42"],
  data: { home: 2, away: 1 },
  // The tab that scored already rendered it locally.
  exclude_connection_id: "26896.319537",
  include: ["connection_count"],
});

for (const channel of result.data ?? []) {
  console.log(channel.name, channel.connection_count);
}

客户端可以直接相互通信。

输入指示器或光标位置不需要经过你的 API。在应用上启用客户端事件后,已订阅的客户端可以直接向频道中的其他成员触发名为 client-something 的事件,每个连接每秒上限 10 次。它们仅在私有频道和存在感知频道上有效,这是有意为之的:app key 包含在你的页面中,因此授权才是让客户端值得信赖以进行广播的保障。将收到的内容视为信号,而非权威状态,因为边缘节点不会验证载荷。

频道会记住什么、不会记住什么。

发布在边缘节点接受事件后即返回。投递是异步的,没有逐客户端回执,投递过程中断开的客户端在重连后不会收到该事件。这是如实的契约,也是为什么持久状态应存储在你的数据库中,而事件只用于通知状态变更。所有套餐的上限相同:每次发布 100 个频道、每批 10 个事件、每个载荷 10 KB、频道名称 164 个字符。

在文档中深入了解。

Realtime 概览在一页中定义了频道、成员和连接。发布事件涵盖广播、批量和排除,缓存频道解释了回放机制,查询频道状态是用于获取占用率和计数的服务端读取。

规模扩展
不失控。

在工作区中组织团队,控制 API 访问权限,通过审计日志追踪变更。

BirdHarbor组织
工作区生产环境沙盒

发送代理

API 密钥 · 客户运营团队
有效
权限访问权限
Email读写
SMS读写
ALAlex Lee 管理员权限已更新

审计日志

生产环境
工作区
生产环境
资源
发送代理
WhatsApp
读取权限读写
成功

从 Realtime 开始。
使用 Bird 跨渠道构建。

你的下一个创意。 随时连接。