实时 webhooks

消息发布出去。 Webhooks 回传回来。

客户端的订阅和断开不会到达您的后端,这意味着您的后端无法知道是否有人在监听。Webhooks 弥补了这一缺口:当频道有人加入或清空时、当成员到达或离开时、当缓存频道没有内容可提供时,边缘节点会发送一个签名事件。

webhooks.ts
signed
app.post("/webhooks/bird", express.raw({ type: "*/*" }), (req, res) => {
  const event = bird.webhooks.unwrap(req.body, req.headers);
  res.sendStatus(200);

  switch (event.type) {
    case "realtime.channel_occupied":
      startStreaming(event.data.channel);
      break;
    case "realtime.channel_vacated":
      stopStreaming(event.data.channel);
      break;
    case "realtime.cache_miss":
      backfill(event.data.channel);
      break;
    default:
      break;
  }
});

别再为无人收听的频道付费。

这是 Bird Realtime 中最经济的优化。channel-occupied 事件是启动高开销任务的信号——行情数据订阅、每秒发布循环;channel-vacated 则是停止的信号。中间订阅者的加入和离开不会触发任何事件,因此这两个事件精确标记了频道生命周期的起止,仅此而已。

五个事件组。按需订阅。

您订阅一个组,该组会推送其中的各个事件类型。一个端点可以同时接收实时事件和平台其他事件,因此 email.bounced 和 realtime.presence 可以到达同一路由,使用相同的签名密钥。

POST /webhooks/bird
realtime.member_added
{
  "type": "realtime.member_added",
  "timestamp": "2026-07-31T09:00:00Z",
  "data": {
    "channel": "presence-room-1",
    "member_id": "u_42"
  }
}
  • realtime.channel_existence频道占用与空出:频道生命周期的两个边界,中间没有多余事件。
  • realtime.presence成员加入与移除。基于身份追踪,同一用户的第二个标签页不会产生额外事件。
  • realtime.connection_count频道当前持有的连接数。需要在应用上启用连接计数。
  • realtime.cache_channels缓存未命中,这是您读取当前状态并发布的信号。
  • realtime.client_events每个客户端事件一次投递,以事件命名:client-typing 会以 realtime.client-typing 的形式到达。

用户用它们构建什么

四种需要服务器了解客户端行为的模式。

  1. 01

    仅在有人观看时运行的任务。

    在 channel occupied 时启动上游数据源、轮询器或渲染任务,在 channel vacated 时关闭它们。没有人打开的仪表盘无需保持运行。

  2. 02

    后端的在线名单副本。

    member added 和 member removed 让您维护自己的房间成员视图,这正是客服在线指示器或席位计数的本质。它们基于身份追踪,因此一个人关闭三个标签页中的一个不会产生任何事件。

  3. 03

    填充冷缓存。

    客户端订阅一个空缓存频道时,会在您的端点上触发未命中事件。读取当前状态并发布,触发未命中的客户端会收到该数据,因为它此时已处于订阅状态。

  4. 04

    监控点对点流量。

    客户端事件在客户端之间传输,无需经过您的 API。订阅 client-events 组后,您的服务器会收到副本,包含频道、连接 ID,以及在 presence 频道中的成员 ID。订阅前需要了解:像光标位置这样的高频信号,每个事件都会产生一次投递。

与所有其他 Bird webhook 一样签名。

投递遵循 Standard Webhooks 规范,包含 webhook-id、webhook-timestamp 和 webhook-signature 头,您可通过端点的签名密钥进行验证。SDK 可在一次调用中完成解包和验证。请验证原始请求体而非重新解析的副本,因为重新序列化 JSON 可能改变已签名的字节;同时保留一个默认分支,以防新事件类型导致路由中断。

投递保证,直白说明。

请将这些视为变更通知而非账本。非 2xx 响应会以指数退避方式重试最多五分钟,之后事件将丢失:实时事件不支持重放,也不会出现在端点的投递尝试日志中。投递无序且没有逐事件回执,因此在延迟或丢失后,请通过 channel-state API 读取当前状态,而非尝试重建。在持久化接受事件后立即返回 2xx,后续再处理。

在控制台中配置。

实时订阅在 Webhooks 页面设置:创建或编辑端点,选择一个 Realtime 应用,然后选择事件组。应用创建后不可更改,但事件组可以。这是目前平台 webhook 功能中仅支持控制台操作的部分,包含实时事件类型的公共 API 请求会被拒绝而非静默接受。

在文档中深入了解。

实时 webhooks 列出了所有投递的事件类型及其数据字段。客户端事件 涵盖您自定义命名的事件组,缓存频道 说明了如何处理未命中,webhooks 与事件 是平台级的端点、签名和密钥轮换规范。

付诸实践。

继续查阅此主题的文档、指南和示例。资源为英文。

动手实践并获取实施简报

了解何时有人开始监听。

将一个端点同时指向 Realtime 和平台其余服务。相同的信封格式、相同的签名密钥、相同的验证调用。

从一个渠道开始。
准备好后,再添加其他渠道。

测试 API 密钥即刻可用。添加支付方式并验证发送者身份后,即可解锁生产环境。

正在使用 Claude Code、Cursor 或 Codex?复制一条设置提示,您的智能代理即可自动安装 Bird CLI 和相关技能。选择您的工具:

Cursor