长轮询和短轮询

(from gpt4-turbo)
长轮询和短轮询是两种客户端与服务器进行数据交换的技术,用于实现如即时消息、实时更新等功能。

短轮询

  • 定义:客户端定期向服务器发送请求,询问是否有新的数据。
  • 特点:实现简单,客户端使用固定的时间间隔重复发送请求。
  • 优点:兼容性好,适用于任何类型的服务器。
  • 缺点:效率低下(可能会有很多无效请求)、响应延迟(数据更新后到下次轮询之间有时间间隔)、服务器负载较高(因为频繁处理请求)。

长轮询

  • 定义:客户端发送请求到服务器后,服务器会保持这个连接,直到有新数据可以发送,然后才响应请求并关闭连接。客户端在接收到服务器的响应后,立即再次发起新的请求。
  • 特点:连接保持打开状态直到服务器有数据发送,然后重新建立连接。
  • 优点:响应更及时(服务器有数据时立即发送),减少了无效请求,降低了服务器负载。
  • 缺点:实现相对复杂,服务器保持连接可能会消耗更多资源,对服务器的并发连接数有较高要求。

简而言之,短轮询是不断地问服务器“现在有新消息吗?”,而长轮询是问了之后等着服务器说“有新消息了”。短轮询对服务器压力较大,实时性较差;长轮询实时性好,但对服务器资源消耗较大。

长轮询本质上仍然属于pull模型,因为它是客户端主动发起请求到服务器并等待服务器的响应。尽管长轮询的行为更接近于实时通信,它模拟了push模型的行为,但通信的发起仍然是由客户端开始的。

与此相对的,真正的push模型,如WebSockets或Server-Sent Events (SSE),建立了一个持久的连接,服务器可以在任何时候主动推送数据到客户端,而不需要客户端的明确请求。在push模型中,一旦建立了连接,就是服务器主动发送信息,而不是客户端请求后才发送。

长轮询与push模型的区别

  • 连接方式:长轮询每次接收到服务器数据后需要重新发起请求;push模型如WebSockets建立一次连接后可以进行多次数据传输,无需重新建立连接。
  • 实时性:长轮询虽然比短轮询实时性高,但仍有延迟;push模型可以做到实时推送,延迟更低。
  • 资源消耗:长轮询需要不断建立和关闭连接,对服务器资源有一定消耗;而push模型建立持久连接后,资源消耗相对较低,尤其在高并发场景下更有效。
  • 复杂性:长轮询的实现比短轮询复杂,但通常比真正的push模型如WebSockets简单,因为后者需要服务器和客户端都支持特定的协议。

总的来说,长轮询是一种改进的pull模型,它尽可能地模拟push模型的行为,但在技术上,服务器的数据传输仍然是作为对客户端请求的响应,而不是完全的服务器主动推送。

posted @ 2023-12-12 11:04  aminor  阅读(402)  评论(0编辑  收藏  举报
/**/ /**/