短轮询和长轮询
-
短轮询
-
概括:短轮询是一种简单的客户端 - 服务器通信方式。客户端按固定间隔发送 HTTP 请求获取数据,服务器收到请求就立即响应,不管数据是否更新。它实现简单,但会频繁请求,可能造成资源浪费和数据更新延迟,适用于实时性要求不高的场景。
-
-
长轮询
-
概括:长轮询也是基于 HTTP 的通信方式。客户端发送请求后,服务器如果没有新数据就保持连接等待,直到有新数据或者超时才响应。客户端收到数据后再发起新请求。它能减少无效请求,比短轮询更具实时性,但会占用服务器资源,用于对实时性要求稍高的场景。
-
短轮询
-
官方定义
-
短轮询(Short - Polling)是一种基于 HTTP 协议的传统的客户端 - 服务器通信方式。客户端按照固定的时间间隔向服务器发送请求,以获取最新的数据。服务器在收到请求后,无论数据是否有更新,都会立即返回响应。这种方式是一种简单的拉取(pull)数据模式,客户端主动地、周期性地从服务器获取信息。
-
-
主要特点
-
简单易懂:短轮询的实现方式相对直接,基于常见的 HTTP 请求 - 响应模式。开发人员容易理解和实现,不需要复杂的服务器推送机制或协议。
-
频繁请求:由于是按照固定间隔进行请求,无论服务器数据是否更新,都会产生请求。这可能导致大量的请求,尤其是在数据更新不频繁的情况下,会浪费网络带宽和服务器资源。
-
响应延迟:如果数据更新时间与轮询间隔不一致,可能会导致客户端获取最新数据的延迟。例如,数据刚更新后,客户端可能要等到下一次轮询才能获取到更新后的数据。
-
-
主要用途及作用
-
简单的数据更新场景:适用于对实时性要求不高的数据更新情况。比如一些简单的网页计数器,每隔一段时间更新页面上的访问量计数;或者在小型网站中用于更新文章的阅读次数等简单统计数据。
-
兼容性好:由于它基于基本的 HTTP 请求,几乎所有的浏览器和服务器环境都支持这种方式,不需要特殊的服务器配置或浏览器支持的高级协议。
-
-
主要原理
-
利用 HTTP 协议的请求 - 响应机制。客户端通过 JavaScript 中的定时器(如
setInterval
函数)定时发送 HTTP 请求到服务器。服务器接收到请求后,查询相关数据,并将查询结果封装成 HTTP 响应返回给客户端。客户端根据返回的数据更新自己的状态或者页面显示内容。
-
-
主要流程
-
客户端设置轮询定时器:使用 JavaScript 等编程语言在客户端代码中设置一个定时器,指定轮询的时间间隔,例如每 5 秒发起一次请求。
-
客户端发起请求:当定时器触发时,客户端通过
XMLHttpRequest
或fetch
等方式发送一个 HTTP 请求到服务器,请求中包含需要获取数据的相关信息,如请求的资源路径、参数等。 -
服务器处理请求:服务器收到请求后,根据请求中的信息查询对应的数据库或者数据存储,获取当前的数据状态。
-
服务器返回响应:将查询到的数据封装成 HTTP 响应格式,返回给客户端。响应内容可以是纯文本、JSON 格式数据、HTML 片段等,根据具体的应用需求而定。
-
客户端接收和处理响应:客户端接收到服务器的响应后,解析响应内容,并根据数据更新页面元素或者应用状态。例如,更新网页上显示的新闻列表、更新产品价格等。然后等待下一次定时器触发,再次发起请求,如此循环。
-
-
与主流技术的相似性和区别
-
与长轮询相似点和区别
-
相似点:都是基于 HTTP 协议的请求 - 响应模式,目的是为了让客户端获取服务器端的数据更新。
-
区别:短轮询不管服务器数据有无更新,都会按照固定时间间隔返回响应;而长轮询会在服务器有新数据或者超时的情况下才返回响应,长轮询能够减少无效请求的次数,更适用于对实时性要求稍高一点的场景。
-
-
与 WebSocket 相似点和区别
-
相似点:都是用于实现客户端和服务器之间的通信,以获取服务器端的数据更新。
-
区别:WebSocket 是一种双向通信的协议,在单个 TCP 连接上实现实时的双向数据传输,连接建立后可以随时发送和接收数据,具有真正的实时性。而短轮询是基于 HTTP 协议的周期性请求 - 响应模式,实时性较差,且会频繁地建立和断开连接。
-
-
长轮询
简单来说,就是一种网络通信技术,减少客户端和服务器频繁连接和数据传输。客户端向服务器发起请求,较长时间内等待服务器响应的机制。常见扫码登录,消息队列RocketMQ。
-
官方定义
-
长轮询(Long - Polling)是一种服务器推送技术。客户端向服务器发送请求,服务器在收到请求后如果没有新的数据可返回,会保持这个请求连接处于开放状态,直到有新的数据产生或者达到超时时间。一旦有新的数据,服务器会立刻将数据返回给客户端,客户端收到数据后会立即发起新的请求,如此循环。
-
-
主要特点
-
半实时性:相较于传统的短轮询,长轮询能够更及时地获取服务器端的最新数据。虽然它不是真正的实时推送,但在一定程度上减少了客户端频繁请求却获取不到新数据所造成的资源浪费。
-
连接保持时间长:请求连接会在服务器端等待数据,可能会持续较长时间,这与传统的 HTTP 请求 - 响应模式中请求很快返回有所不同。
-
对服务器资源有一定要求:由于连接需要长时间保持打开状态,可能会占用服务器的资源,如线程、内存等。如果有大量客户端同时进行长轮询,服务器需要合理管理这些资源,以避免资源耗尽。
-
-
主要用途及作用
-
用于实时性要求稍高的应用场景:例如在线聊天系统中简单的消息提醒,当用户打开聊天窗口时,通过长轮询可以及时获取新消息,虽然不如 WebSocket 等真正的实时通信协议那么高效,但可以作为一种简单的实现方式。
-
在一些对数据更新及时性有要求的网页应用中:如股票价格更新、新闻资讯推送等。它能够让客户端在一定程度上及时获取最新信息,而不需要用户手动刷新页面。
-
-
主要原理
-
基于 HTTP 协议。客户端发起一个 HTTP 请求到服务器,服务器接收到请求后,检查是否有新的数据可供返回。如果没有,就把这个请求挂起,直到新的数据到来或者超时。从客户端角度看,它在等待服务器响应,这个等待时间可能会比较长,一旦收到响应(包含新的数据),就认为是一个完整的请求 - 响应过程结束,然后可以发起下一轮请求。
-
-
主要流程
-
客户端发起请求:通过 JavaScript 等方式发送一个 HTTP 请求到服务器,请求获取最新的数据。
-
服务器处理请求:服务器收到请求后,判断是否有新的数据。如果没有,将请求保持在等待状态,同时继续监测数据变化。
-
数据更新与响应:当服务器端的数据更新后,将新的数据封装在 HTTP 响应中,返回给客户端。
-
客户端接收与再次请求:客户端收到包含新数据的响应后,进行相应的数据处理(如更新页面显示),然后立即发起新的请求,重复上述流程。
-
-
与主流技术的相似性和区别
-
与 WebSocket 相似点和区别
-
相似点:都用于实现服务器和客户端之间的通信,目的是为了让客户端能够获取服务器端的实时数据。
-
区别:WebSocket 是一种全双工通信协议,在单个 TCP 连接上实现实时的双向数据传输,真正做到实时通信,连接建立后可以随时发送和接收数据,不需要像长轮询那样频繁地建立和断开连接。长轮询仍然基于 HTTP 协议的请求 - 响应模式,只是延长了请求等待时间来模拟实时性。
-
-
与短轮询相似点和区别
-
相似点:都基于 HTTP 协议的请求 - 响应模式。短轮询也是客户端不断向服务器发送请求来获取最新数据。
-
区别:短轮询不管服务器有没有新数据,客户端都会按照固定的时间间隔发送请求,可能会有很多次请求返回的数据都是相同的,浪费网络资源和服务器资源。而长轮询只有在有新数据或者超时的情况下才会返回响应,减少了无效请求的次数,提高了获取新数据的效率。
-
-