知识卡片

有状态可离线客户端:把写路径延伸到终端设备

普通读书笔记卡

内容

传统Web应用假设客户端无状态、服务器拥有数据权威——浏览器只能在某个时间点读取一次数据,此后对数据变化一无所知,除非显式轮询(RSS这类基于HTTP的订阅本质也只是基础轮询)。但单页应用与移动应用已经获得了大量有状态能力(客户端UI交互、本地持久存储),这重新点燃了”离线优先”应用的兴趣:尽可能用本地数据库工作、无需联网,网络可用时在后台与远程服务器同步——对蜂窝网络缓慢不可靠的移动设备而言,这能避免用户界面被同步网络请求卡住。一旦不再假设客户端无状态,就可以把设备上的状态看作服务器状态的缓存:屏幕上的像素是客户端模型对象的物化视图,模型对象则是远程数据中心本地状态的副本。服务端发送的事件(EventSource API)和WebSockets这类协议让服务器可以在浏览器保持连接期间主动推送变化,而不必等浏览器发起请求——用[[写路径与读路径索引缓存物化视图都在改变这条边界]]的语言来说,这相当于把写路径一直延伸到了终端用户设备:客户端初始化时仍走读路径拿到初始状态,此后就能依赖服务器发来的状态变更流。设备离线也不是新问题——[[消费者偏移量类比复制日志序列号与磁盘环形缓冲区效应]]里基于日志的消息代理消费者断线重连、不错过消息的技术,同样适用于把每个用户设备当成一个订阅小事件流的消费者。

参考来源

- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"有状态、可离线的客户端""将状态变更推送给客户端"(源文件:_epub-src/ch12_split_001.html) - 结论依据:原文说明单页应用/移动应用带来的离线优先兴趣,将设备状态类比为服务器状态的缓存,并说明EventSource/WebSockets让服务器能主动推送变化,本质是把写路径延伸到终端设备,与基于日志消息代理的断线重连技术相通,直接支撑本卡片结论。 - 原始内容:我们可以将设备上的状态视为服务器状态的缓存……用我们的写路径与读路径模型来讲,主动将状态变更推至到客户端设备,意味着将写路径一直延伸到终端用户……同样的技术适用于单个用户,每个设备都是一个小事件流的小小订阅者。