Google Drive 使用什么技术来获取实时更新?

What technology does Google Drive use to get real-time updates?

Google驱动器使用什么技术来实现实时?

当我输入多个用户正在访问的 Google Drive 文档时,Chrome Developer Tools Network 选项卡显示没有 WebSockets。

我看到两种最常见的 AJAX 调用类型在 URL 中有 "bind?" 或 "save?"。 "save?" POST 每次我输入时都会发出请求,这很正常 AJAX 用于向服务器发送更新。

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

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

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

Google 的工作有名称吗?如果是这样,我该如何尝试实现它?

Google的Drive实时更新解决方案有名称吗(例如"long polling"或"sockets")?

直到现在它还没有名字。我将其称为 "no-polling," 以与轮询和长轮询形成对比。

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

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

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

我该如何尝试实现它?

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

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

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

    XHR objects can emit progress events before the request is complete. The (partial) response is accessible using xhr.responseText. ~~There's no simple way to watch for progress with fetch yet (as of May 2016).~~ When using fetch one can watch for progress by consuming the res.body ReadableStream.

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

服务器必须:

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

在我看来,无轮询似乎优于长轮询,尽管我没有玩过多少。长轮询强制在延迟和消息大小之间进行权衡(给定更新速率),而无需进行权衡的无轮询。长轮询的另一个缺点是它会导致很多HTTP请求,每次都要付出HTTP的开销。

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

此处描述的无轮询听起来像“服务器发送事件 - SSE”,其中客户端发送内容类型为“text/event-stream”的 http get 请求。 服务器保留请求并在需要时向客户端发送响应。 它是持久的,但与网络套接字不同,因为网络套接字是 2 种通信方式,但 SSE 是一种方式(仅服务器向客户端发送 payload/message)