一个订单页面可能需要与数据库同时进行更新。Webhook 可以触发数据库变更。然后您的服务器可以将结果状态发布到已连接的屏幕上。
Bird Realtime 通过 WebSocket 投递更新。
什么是频道、成员和连接?
频道将订阅分组。连接是一个已打开的 WebSocket。成员是与其他订阅者共享的经过身份验证的标识。
在线状态频道共享哪些成员已订阅。一个成员可以使用多个连接,例如多个浏览器标签页。
Bird 在第一个连接订阅时创建频道,在最后一个连接离开后移除频道。您只需向频道名称发布,无需创建单独的频道资源。
每个连接会收到一个标识符。您的后端使用它来批准私有订阅。发布时可以排除该连接,以避免回显其自身的更新。
如果一个成员打开三个标签页,这些标签页可以在同一个成员标识下创建三个连接。在线状态在第一个连接时报告该成员加入,在最后一个连接关闭后报告离开。因此关闭中间的标签页不会将该成员从列表中移除。
谁可以订阅?
频道的前缀决定订阅是否需要来自后端的授权。
您可以选择 1 到 164 个字符的 Bird 频道名称,使用字母、数字和 _ - = @ , . ;。将前缀包含在该长度内,以确保生成的私有名称不超过限制。
| 名称前缀 | 访问权限 |
|---|---|
| 无私有或在线状态前缀 | 对持有应用密钥的客户端公开。 |
private- | 您的后端批准并签名每个订阅。 |
presence- | 您的后端批准订阅并提供与订阅者共享的成员标识。 |
private-encrypted- | 私有访问,事件内容使用您控制的密钥加密。 |
应用密钥出现在客户端代码中,因此隐晦的公共频道名称无法保护机密数据。将应用密钥保存在您的服务器上,并用它来签署订阅审批。
对于私有订阅,客户端将其连接标识符和频道名称发送到您的授权端点。您的服务器在返回签名之前检查访问权限。该端点仅授权访问,不会像 webhook 那样接收每个已发布的事件。
这种区别在实际中意味着什么?
使用 webhook 处理服务器上的可恢复工作。使用发布/订阅向已连接的客户端推送更新。
Bird webhook 向您运营的 HTTPS 端点发送事件。重试跨度约为 27.5 小时,等待时间会根据随机变化、接收方过载和请求的延迟进行调整。该时间窗口给您的接收方足够的恢复时间。错过的事件重放可以恢复仍未成功的投递。
Realtime 频道将您发布的事件发送给已订阅的客户端。断开连接的客户端可能会错过该事件。缓存频道可以在事件仍在缓存期间将其最新事件提供给新订阅者,但不会保留中间的事件历史。
将机密的服务器端处理保留在 webhook 接收方之后。仅发布频道的授权客户端可以看到的状态。
Webhook 事件类型来自 Bird 的目录,例如 email.delivered。使用 Realtime 时,您在发布时选择应用程序的事件名称。event 名称接受 1 到 200 个字符。前缀 bird: 和 bird_internal: 是保留的,不能用于命名您的应用程序事件。
客户端还会收到关于订阅成功、成员变更和连接计数的协议事件。这些事件描述的是连接或频道本身,而不是您应用程序的订单或消息。
如何将它们结合使用?
使用 webhook 存储的事件驱动 Realtime 更新,将其推送给已连接的客户端。
在服务器上接收业务事件。在发布之前更新持久化状态。然后发布已连接客户端需要的状态。
对于订单页面,webhook 可以触发数据库更新。然后您的服务器发布更新后的订单状态,使客户的页面无需刷新即可更新。
保持数据库状态在重新连接后可读,因为断开连接的客户端可能会错过发布。Webhook、轮询或流式传输比较了各种恢复方案。
Realtime 也有自己的 webhook,用于频道占用情况和成员加入或离开。通过仪表板配置这些 webhook,而不是通过公共 webhook API。
Realtime 概述介绍客户端连接。Webhooks介绍向您的服务器投递的请求。
简而言之
一个频道可以有多个订阅者。
Webhook 请求发送到一个已注册的端点。一次发布会发送给订阅了该频道的所有客户端。
私有订阅需要后端授权。
应用密钥出现在客户端代码中。私有和在线状态前缀需要来自您服务器的签名。
成员可以拥有多个连接。
一个成员使用三个标签页时,在第一个连接时加入在线状态,在最后一个连接关闭后离开。
将投递恢复与已连接视图结合使用。
使用 webhook 恢复来处理服务器事件,并使用存储的状态在断开连接后恢复 Realtime 视图。