Grokking-System-Design
  • 译者
  • 0. 系统设计面试指南
  • 1. 设计类似TinyURL的短链服务
  • 2. 设计 Pastebin
  • 3. 设计Instagram
  • 4. 设计Dropbox
  • 5. 设计Facebook Messager
  • 6. 设计 Twitter
  • 7. 设计YouTube或Netflix
  • 8. 设计输入提示建议
  • 9. 设计API限流器
  • 10. 设计 Twitter 搜索
  • 11. 设计网络爬虫
  • 12. 设计 Facebook 的新闻信息流
  • 13. 设计 Yelp 或附近的朋友
  • 14. 设计 Uber 后端
  • 15. 设计票务大师
  • 16. 附加资源
  • 17. 分布式系统的核心特征
  • 18. 负载均衡
  • 19. 缓存
  • 20. 分片或数据分块
  • 21. 索引
  • 22. 代理
  • 23. 冗余和复制
  • 24. SQL 与 NoSQL
  • 25. CAP 理论
  • 26. 一致性哈希
  • 27. 长轮询 / WebSockets / 服务器发送事件
Powered by GitBook
On this page
  • 1. Ajax 轮询
  • 2. HTTP 长轮询
  • 3. WebSockets
  • 4. 服务器发送事件

27. 长轮询 / WebSockets / 服务器发送事件

Previous26. 一致性哈希

Last updated 2 years ago

长轮询、WebSockets 和服务器发送事件之间的区别是什么呢?

长轮询、WebSockets 和服务器发送事件是在客户端(如网页浏览器)和网站服务器之间的主流通信协议。首先,我们从了解标准 HTTP 网络请求开始。以下是常规的 HTTP 请求的事件序列:

  1. 客户端打开连接,从服务器请求数据。

  2. 服务器计算响应。

  3. 服务器在开放的请求上将响应发送回客户端。

HTTP 协议

1. Ajax 轮询

轮询是一个被绝大多数 AJAX 应用所使用的的标准技术。其主要思想是客户端向服务器重复轮询(或发送请求)以获得数据。客户端创建请求并等待服务器使用数据响应。如果没有可用的数据,则返回一个空的响应。

  1. 客户端打开连接,并使用常规 HTTP 从服务器请求数据。

  2. 请求的网页定期向服务器发送请求(例如 0.5 秒一次)。

  3. 服务器计算响应并将其发送回客户端,如同常规 HTTP 信息流。

  4. 客户端周期性地重复上述三步,从服务器获得更新。

轮询的问题是客户端必须持续向服务器请求新数据。结果是,大量响应是空的,导致 HTTP 开销。

2. HTTP 长轮询

这是传统轮询技术的一个变种,允许服务器在有数据的时候将信息推送给客户端。使用长轮询,客户端从服务器请求信息的做法和标准轮询一样,但是服务器可能不会立即响应。这是该技术有时被称作「挂起 GET」的原因。

  • 如果服务器没有任何可以发送给客户端的数据,则不会发送空响应,而是保留该请求,等待到有数据的时刻。

  • 一旦有数据,则将一个完整的响应发送给客户端。客户端然后立即重新从服务器请求信息,使得服务器将几乎总是有正在等待的请求,可以使用该请求发送数据以响应一个事件。

使用 HTTP 长轮询的应用的基本生命周期如下:

  1. 客户端使用常规 HTTP 创建初始请求,然后等待响应。

  2. 服务器延迟响应,直到有更新或者超时。

  3. 当有更新时,服务器向客户端发送一个完整的响应。

  4. 客户端通常发送一个新的长轮询请求,在接收到响应之后立即发送,或者经过暂停之后发送以允许一个可以接收的延迟时间段。

  5. 每个长轮询请求都有超时时间。如果因为超时导致连接关闭,客户端必须在连接关闭之后周期性地重新连接。

3. WebSockets

4. 服务器发送事件

在服务器发送事件下,客户端和服务器之间建立一个持久长期的连接。服务器使用该连接向客户端发送数据。如果客户端想要向服务器发送数据,它将请求使用另一个技术或协议实现。

  1. 客户端使用常规 HTTP 向服务器请求数据。

  2. 请求的网页打开向服务器的连接。

  3. 当有新信息时,服务器向客户端发送数据。

当我们需要从服务器到客户端的实时流量,或者当服务器循环生成数据并将会向服务器发送多重事件时,服务器发送事件是最好的。

Ajax 轮询协议
长轮询协议

WebSocket 提供了在一个单独的 TCP 连接上的交流频道。它提供了客户端和服务器之间的永久连接,双方都可以使用该链接在任何时间发送数据。客户端通过一个称为 WebSocket 握手的过程建立一个 WebSocket 连接。如果该过程成功,则服务器和客户端可以在任何时间双向交换数据。 WebSocket 协议使得客户端和服务器之间的交流开销更低,促进从服务器发出和发往服务器的实时数据传输。通过提供一个标准化的方法,使得在客户端没有请求数据的情况下,服务器可以向浏览器发送内容,并在保持连接打开的情况下允许信息来回交互,使得该协议变成可能。使用该方法,客户端和服务器之间可以有一个持续的双向对话。

WebSockets 协议
服务器发送事件协议
全双工