【问题标题】:What technology does Google Drive use to get real-time updates?Google Drive 使用什么技术来获取实时更新?
【发布时间】:2016-05-06 08:15:15
【问题描述】:

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

当我输入一个由多个用户访问的 Google Drive 文档时,Chrome 开发者工具网络选项卡显示没有 WebSocket。

我看到两种最常见的 AJAX 调用类型都有“绑定?”或“保存?”在网址中。 “保存?”每次我输入时都会发出 POST 请求,这很有意义 - 用于向服务器发送更新的普通 AJAX。

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

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

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

Google 正在做的事情有名称吗?如果是这样,我该如何尝试实现它?

【问题讨论】:

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


    【解决方案1】:

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

    直到现在它还没有名字。我将其称为“无轮询”,以与轮询和长轮询形成对比。

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

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

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

    我该如何尝试实现它?

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

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

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

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

    • 当当前请求结束时,客户端应该发起一个新的请求。

    服务器必须:

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

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

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

    【讨论】:

    • 我认为 Facebook 也做了类似的事情。尝试与某些人进行对话:它会随着时间的推移获取更多数据,从而保持持久的 HTTP 连接。
    • @enlitement 不错!我也看到了。 GETs/pull? 最多持续约 50 秒,并具有一系列 JSON 有效负载和心跳消息。
    • 当前的fetch 规范表明res.body is a ReadableStream,使您能够通过fetch 观察进度。
    • 这很有趣……我以前从未听说过这种方法。
    • 是否有任何框架已经实现了这个?或任何实现这一点的要点? @MaxHeiber
    【解决方案2】:

    此处描述的无轮询听起来像“服务器发送的事件 - SSE”,其中客户端发送带有“文本/事件流”作为内容类型的 http get 请求。 服务器保留请求并在需要时向客户端发送响应。 它是持久的,但与 web-socket 不同,因为 web-socket 是 2 路通信,但 SSE 是一种方式(只有服务器向客户端发送有效负载/消息)

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      相关资源
      最近更新 更多