跳到主要内容

同步引擎

同步引擎

宿主让每个打开的页面保持实时。浏览器只保存它正在显示的行;宿主规划每次读取,把每次提交路由到它所改变的视图,并推送这些变更。

通信协议

  • POST /__bolt/q——读取与集合查询
  • POST /__bolt/act——所有写入与操作、start 以及审批决定,每个都带幂等键
  • GET 与 POST /__bolt/live——每个可见标签页一个 SSE 流,以及视图注册
  • PUT 与 GET /__bolt/files/<key>——向指定字段上传,以及按文件引用下载
  • /__bolt/session/…——登录与邀请

路由一次提交

写入的提交记录就是它的 RETURNING 结果集。宿主在内存中针对变更前后的镜像评估每个已注册视图,并保存每个视图的当前结果。确定命中的变更以 patch 帧发送——在某个索引处插入或更新一行,或按 id 移除一行——它由变更后的镜像直接构建而无需读取,并经过视图的 select、查看者的字段遮罩及其 orderBy 投影。

无法精确定位的变更会尽可能小范围地回退:按主键读取一行,或在视图涉及搜索、聚合、分页越界,或按已变化的关联字段排序时重新读取整个视图。每次回退都会被计数。

读到自己的写入

/act 的回复带有其最后一次提交的序号,客户端在自己的流应用了该序号后才完成这次写入——最多等待 5 秒,且仅在流打开时等待。

权限与发布版本

查看者权限变化时,受影响的视图会重新给出结果。发布版本变更、重置、恢复或分叉会关闭连接,并告知新的发布版本。

限制

超过 2 MiB 的订阅、同一连接上的第 501 个订阅,或超出保留配额的注册,都会得到各自带类型的错误,而流本身不受影响。标签页隐藏 30 秒后会关闭其流。

这里没有什么

没有浏览器数据库,没有离线队列,也没有跨标签页代理。SSE 只承载浏览器的实时流;集成链接保持各自的连接。