Page 261 - Web性能权威指南
P. 261
SSE 主要有两个局限。一,只能从服务器向客户端发送数据,不能满足需要请求流
的场景(比如向服务器流式上传大文件);二,事件流协议设计为只能传输 UTF-8
数据,即使可以传输二进制流,效率也不高。
话虽如此,UTF-8 的限制往往可以在应用层克服:SSE 可以通知应用说服务器上有
一个新的二进制文件可以下载了,应用只要再分派一个 XHR 请求去下载即可。虽
然这样多了一次往返延迟,但也能利用上 XHR 提供的诸多便利:响应缓存、传输
编码(压缩),等等。如果文件是流式下载的,那它就无法被浏览器缓存。
实时推送就像轮询一样,可能会极大影响电池的待机时间。首先,可以考
虑批量处理消息,尽量少唤醒无线电模块。其次,避免不必要的长连接,
SSE 连接在无线电空闲时不会断开。更多信息,请参考 8.2 节“消除周期
性及无效的数据传输”。
通过 TLS 实现 SSE 流
SSE 通过常规 HTTP 连接实现了简单便捷的实时传输机制,服务器端容易部署,
客户端也容易打补丁。可是,现有网络中间设备,比如代理服务器和防火墙,都
不支持 SSE,而这有可能带来问题:中间设备可能会缓冲事件流数据,导致额外
延迟,甚至彻底毁掉 SSE 连接。
如果你碰到了这样或类似的问题,那么可以考虑通过 TLS 发送 SSE 事件流,具体
请参考 4.1 节中的“Web 代理、中间设备、TLS 与新协议”。
服务器发送事件 | 249