缓存频道
缓存频道会记住最新事件,并向每个新订阅者重放该事件。更新发生后才连接的客户端无需等待下一次发布即可渲染当前状态。
缓存频道适用于比分、设备状态、构建进度或订单状态等实时值。订阅会提供初始状态及后续更新。
命名缓存频道
频道名称决定是否启用缓存。将 cache- 放在名称开头,或紧跟在频道类型前缀之后。
| 名称 | 已缓存 | 订阅方式 |
|---|---|---|
| cache-orders | 是 | 持有 app key 的任何人 |
| private-cache-orders | 是 | 后端为客户端签名 |
| presence-cache-lobby | 是 | 后端签名,跟踪成员 |
| orders-cache | 否 | 持有 app key 的任何人 |
orders-cache 不是缓存频道。cache- 前缀必须位于名称中 private- 或 presence- 前缀之后。
订阅
const bird = new BirdRealtime({ appKey: "your-app-key", region: "us1" });
const match = bird.subscribe("cache-match-42");
match.bind("score-updated", (data) => {
render(data);
});
match.bind("bird:cache_miss", () => {
console.log("nothing cached for this channel yet");
});let bird = BirdRealtime(options: .init(appKey: "your-app-key", region: "us1"))
let match = bird.subscribe("cache-match-42")
match.bind("score-updated") { data in
render(data)
}
match.bind("bird:cache_miss") { _ in
print("nothing cached for this channel yet")
}val bird = BirdRealtime(BirdRealtimeOptions(appKey = "your-app-key", region = "us1"))
val match = bird.subscribe("cache-match-42")
match.bind("score-updated") { data ->
render(data)
}
match.bind("bird:cache_miss") {
println("nothing cached for this channel yet")
}命中时,缓存的事件在订阅成功后送达。它携带原始事件名称和载荷,因此同一个处理器可以处理缓存事件和实时事件。
未命中时,客户端在该频道上收到 bird:cache_miss。原因是该频道从未收到过发布,或其缓存事件已过期。
未命中时填充缓存
如果某个端点订阅了 realtime.cache_channels,未命中事件也会到达你的服务器。在 webhook 处理程序中读取当前状态,然后将其发布到该频道。
await bird.realtime.publish(appId, {
event: "score-updated",
channels: ["cache-match-42"],
data: await currentScore(42),
});client.realtime.publish(
app_id,
event="score-updated",
channels=["cache-match-42"],
data=current_score(42),
)_, err := client.Realtime.Publish(context.Background(), appID, bird.RealtimePublishParams{
Event: "score-updated",
Channels: []string{"cache-match-42"},
Data: currentScore(42),
})$bird->realtime->publish($appId, (new RealtimePublish())
->setEvent('score-updated')
->setChannels(['cache-match-42'])
->setData(currentScore(42)));触发未命中的客户端在你的服务器发布替代事件之前已完成订阅,因此会收到新状态。该流程也会为首个订阅者填充空缓存。
缓存内容与保留时间
通过 API 发布的事件会被缓存,包括单次发布和批量发布。名称以 client- 开头的客户端事件不会被缓存。
缓存事件最多可保留 30 分钟,但可能更早过期。对于更新不频繁的频道,应通过缓存未命中 webhook 重新填充,而不是假设缓存仍然有效。
每个频道只记住最近一次事件。如果你先发布 score-updated,再发布 match-ended,新订阅者只会收到 match-ended。每个缓存频道只使用一个事件名称,或者在每次载荷中包含完整状态。
缓存限制
缓存频道只存储最近一次事件,不保留事件历史。客户端离线期间错过两次更新后,只会收到最新状态,而没有中间事件。请将持久状态保存在数据库中。重新连接后,客户端会重新订阅,并在缓存事件仍然可用时渲染该事件。参见发布事件了解投递保证。
后续步骤
相关资源
继续查阅此主题的文档、指南和示例。资源为英文。