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 的任何人可见。
五种房间类型。
相同协议、相同客户端、相同发布调用。区别只在名称。
- 01
公开频道。
无需授权端点,无需注册。持有 app key 的任何人都可以订阅,适用于构建结果、实时比分、航班信息或状态页,不适用于限定到单个客户的内容。名称中不要包含标识符:orders 不暴露任何信息,orders-user-4821 则暴露了用户 4821 的存在。
- 02
私有频道。
以 private- 开头的名称会将订阅路由到你自己的端点,该端点检查会话并使用 app secret 对连接 id 和频道名称进行签名。你的规则,你的会话,你的 403。边缘节点验证签名,未通过验证的请求无法到达频道。
- 03
存在感知频道。
在私有频道授权的基础上附加身份信息,每个订阅者都能获取成员列表,并收到加入和离开的通知。这是唯一带有成员名册的频道类型。
- 04
加密频道。
private-encrypted- 频道的载荷由你的服务器使用 32 字节主密钥加密,该密钥永远不会出现在 Realtime 请求中。边缘节点及其与浏览器之间的一切只能看到密文。频道名称和事件名称保持明文,因此选择不会泄露保护内容的名称。
- 05
缓存频道。
在名称前(任何类型前缀之后)加上 cache-,频道会记住最近一次通过 API 发布的事件,并将其回放给每个新订阅者。订阅即充当初始状态获取。两个值得在设计时考虑的限制:仅保留最近一条事件,且它可能在 30 分钟上限之前过期,因此每次载荷中放入完整状态,并通过 cache-miss webhook 重新填充,而不是假设缓存是热的。
一次发布,最多一百个频道。
发布是从你的服务器发出的普通 REST 调用。在一个请求中指定最多 100 个频道,边缘节点会将事件扇出到所有频道。一个批次可携带最多 10 个不相关事件,每个发送到各自的频道。将操作客户端的连接 id 作为 exclude_connection_id 传入,已在本地应用变更的标签页会被跳过。在 include 中请求连接数或成员数,响应会告诉你发布时每个频道的状态。使用相同的幂等键重试,不会重复投递。
// 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 访问权限,通过审计日志追踪变更。
审计日志
生产环境- 工作区
- 生产环境
- 资源
- 发送代理
- 读取权限读写