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)
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 usingxhr.responseText
. ~~There's no simple way to watch for progress withfetch
yet (as of May 2016).~~ When usingfetch
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)