Google云端硬盘使用什么技术来获取实时更新?

时间:2016-01-28 19:23:35

标签: websocket real-time long-polling server-sent-events

Google云端硬盘使用什么技术进行实时制作?

当我输入多个用户正在访问的Google云端硬盘文档时,Chrome开发者工具网络标签显示没有WebSockets。

我看到两种最常见的AJAX调用类型都有" bind?"或者"保存?"在URL中。 "保存&#34?;每次输入时都会发出POST请求,这对于将更新发送到服务器来说是正常的AJAX。

当另一个用户输入时,最新的"绑定?" GET呼叫保持打开状态,通过该连接传输的数据量也会增加。周期性地," bind?" s关闭,新的打开,逻辑似乎是持续时间和数据大小的某种功能。

这不是长轮询,因为当服务器发送更新时,它不会完成响应。

这似乎不是服务器发送的事件,因为内容类型是" text / plain"而不是" text / stream"。

Google正在做什么名称?如果是这样,我该如何尝试实现这个?

Chrome Dev Tools - editing a Google Drive document

1 个答案:

答案 0 :(得分:40)

Google的驱动器实时更新解决方案是否有名称(例如“长轮询”或“套接字”)?

直到现在它还没有名字。我将其称为“无轮询”,与民意调查和长期民意调查形成鲜明对比。

通过轮询,客户端会定期发送新数据的查询。

通过长轮询,客户端查询数据,服务器保留请求,在有更新时以更新结束响应。

无轮询(Google云端硬盘的功能)利用浏览器在请求完成之前如何从请求正文中读取数据。因此,当协作者进行更多的键入和编辑时,服务器会将更多数据附加到当前请求。如果满足某些限制(内容的长度或请求的持续时间),请求完成,客户端向服务器发起新请求。

我该如何尝试实现这个?

让客户端向服务器发送更新:这可以通过普通的POST来完成。

让客户端从服务器订阅更新:

  • 客户端发送更新流的GET,然后在响应完成之前开始读取响应主体。

      

    XHR对象可以在请求完成之前发出progress个事件。可以使用xhr.responseText访问(部分)响应。 ~~使用fetch yet(截至2016年5月),没有简单的方法可以观察进度。~~使用fetch时,可以consuming the res.body ReadableStream观察进度。< / p>

  • 客户端应在当前请求结束时发起新请求。

服务器必须:

  • 跟踪哪些客户订阅了哪些更新流。
  • 当请求进入特定更新流时,请将数据写入响应,但在数据量变大或达到超时之前不要完成响应。

在我看来,没有民意调查似乎优于长期民意调查,尽管我没有多玩过它。长轮询强制延迟和消息大小之间的权衡(给定恒定的更新速率),不必进行权衡无轮询。长轮询的另一个缺点是它可能导致许多HTTP请求,每次都支付HTTP的开销。

No-polling相对于WebSockets的一大优势是每个浏览器都支持不轮询,尽管WebSocket支持非常好 - IE10+