当前位置: 首页 > news >正文

「JavaScript深入」轮询(Polling):基础的实时通信方式

轮询(Polling)

    • 轮询技术概述
      • 1. 基本原理
      • 2. 技术对比
    • 短轮询(Short Polling)
      • 1. 短轮询的工作原理
      • 2. 短轮询示例(JavaScript + Express 服务器)
        • 服务器端(Node.js + Express)
        • 客户端(HTML + JavaScript)
      • 3. 短轮询的优缺点
    • 长轮询(Long Polling)
      • 1. 长轮询的工作原理
      • 2. 长轮询示例(JavaScript + Express 服务器)
        • 服务器端(Node.js + Express)
        • 客户端(HTML + JavaScript)
      • 3. 长轮询的优缺点
      • 4. 优化策略
    • 性能对比与优化
      • 1. 请求数量对比
      • 2. 服务器资源占用
      • 3. 优化建议
    • 轮询的应用场景
    • 现代替代方案
      • 1. WebSocket [【详解:WebSocket:高效的双向实时通信技术】](https://blog.csdn.net/XH_jing/article/details/146372717)
      • 2. Server-Sent Events (SSE)[【详解:Server-Sent Events (SSE):轻量级实时通信技术】](https://blog.csdn.net/XH_jing/article/details/146369269)
      • 3. 技术选型建议
    • 安全与可靠性
      • 1. 安全防护
      • 2. 可靠性保障
    • 总结

在 Web 开发中,实现服务器与客户端的实时通信有多种方式,其中轮询(Polling)是一种最基本的方法。轮询可以分为短轮询(Short Polling)和长轮询(Long Polling),它们各有优缺点,并在特定场景下仍然被广泛使用。


轮询技术概述

1. 基本原理

  • 客户端主动请求: 定期向服务器发送HTTP请求
  • 服务器响应数据: 返回当前可用数据或保持连接
  • 实现简单: 基于标准HTTP协议,无需特殊服务器支持

2. 技术对比

短轮询 vs 长轮询 vs WebSocket 对比

特性短轮询长轮询WebSocket
连接方式周期性请求持续等待请求持续打开连接
请求频率固定间隔事件驱动持续连接
服务器压力中等
延迟极低
适用场景数据更新不频繁需要更快更新高频双向通信
实现复杂度简单中等较高

短轮询(Short Polling)

1. 短轮询的工作原理

短轮询是一种简单的 HTTP 请求机制,客户端会定期向服务器发送请求,检查是否有新的数据。如果服务器有新数据,就返回数据;否则,返回空响应。

2. 短轮询示例(JavaScript + Express 服务器)

服务器端(Node.js + Express)
const express = require('express');
const app = express();
const port = 3000;

let messages = [];

app.get('/poll', (req, res) => {
  res.json({ messages });
  messages = []; // 清空已发送消息
});

app.post('/send', express.json(), (req, res) => {
  messages.push(req.body.message);
  res.sendStatus(200);
});

app.listen(port, () => {
  console.log(`Server running on http://localhost:${port}`);
});
客户端(HTML + JavaScript)
<script>
function pollServer() {
  fetch('/poll')
    .then(response => response.json())
    .then(data => {
      if (data.messages.length > 0) {
        console.log('New messages:', data.messages);
      }
    })
    .catch(err => console.error('Polling error:', err));
  
  setTimeout(pollServer, 5000); // 每 5 秒轮询一次
}

pollServer();
</script>

3. 短轮询的优缺点

优点:

  • 简单易实现,不需要 WebSocket 或 SSE。
  • 适用于数据更新不频繁的场景。

缺点:

  • 请求频繁,可能会对服务器造成较大压力。
  • 即使没有新数据,仍会发送 HTTP 请求,浪费带宽。
  • 延迟较高,数据更新不够实时。

长轮询(Long Polling)

1. 长轮询的工作原理

长轮询与短轮询类似,但区别在于:当服务器暂时没有新数据时,它不会立即返回响应,而是保持请求打开,直到有新数据可用。

2. 长轮询示例(JavaScript + Express 服务器)

服务器端(Node.js + Express)
const express = require('express');
const app = express();
const port = 3000;

let pendingRequests = [];

app.get('/longpoll', (req, res) => {
  pendingRequests.push(res);
});

app.post('/send', express.json(), (req, res) => {
  const message = req.body.message;
  pendingRequests.forEach(res => res.json({ message }));
  pendingRequests = []; // 清空请求队列
  res.sendStatus(200);
});

app.listen(port, () => {
  console.log(`Server running on http://localhost:${port}`);
});
客户端(HTML + JavaScript)
<script>
function longPoll() {
  fetch('/longpoll')
    .then(response => response.json())
    .then(data => {
      console.log('Received message:', data.message);
      longPoll(); // 重新发起请求
    })
    .catch(err => {
      console.error('Long polling error:', err);
      setTimeout(longPoll, 5000); // 发生错误时,5 秒后重试
    });
}

longPoll();
</script>

3. 长轮询的优缺点

优点:

  • 减少了短轮询的无效请求,降低了服务器压力。
  • 能更快地响应新数据,提高实时性。

缺点:

  • 每个客户端会占用服务器的连接资源,可能导致并发处理能力下降。
  • 仍然基于 HTTP 请求,连接建立和关闭会有一定开销。

4. 优化策略

  • 超时处理: 设置合理的超时时间(如30秒)

  • 心跳机制: 定期发送空响应保持连接

  • 连接管理: 限制最大连接数,防止资源耗尽


性能对比与优化

1. 请求数量对比

时间周期短轮询请求数长轮询请求数
1分钟12次1-2次
1小时720次60-120次

2. 服务器资源占用

  • 短轮询:

    • 高CPU占用(频繁处理请求)
    • 内存占用稳定
  • 长轮询:

    • 较低CPU占用
    • 较高内存占用(保持连接)

3. 优化建议

  • 缓存机制: 减少数据库查询

  • 连接复用: 使用HTTP/2

  • 负载均衡: 分布式部署


轮询的应用场景

  • 短轮询适用场景

    • 低频数据更新,如每分钟一次的天气数据获取。
    • 服务器端负载敏感,不希望长时间保持连接。
  • 长轮询适用场景

    • 需要更实时的数据更新,如在线通知系统。
    • 服务器可以支持一定数量的长时间挂起请求。
  • WebSocket 更适合的场景

    • 高并发和高频数据交换,如在线聊天、游戏。
    • 需要服务器和客户端同时能够发送消息的应用。

现代替代方案

1. WebSocket 【详解:WebSocket:高效的双向实时通信技术】

// 建立WebSocket连接
const socket = new WebSocket('wss://example.com');

socket.onmessage = (event) => {
  processUpdates(JSON.parse(event.data));
};

2. Server-Sent Events (SSE)【详解:Server-Sent Events (SSE):轻量级实时通信技术】

// 创建EventSource
const es = new EventSource('/api/sse');

es.onmessage = (event) => {
  processUpdates(JSON.parse(event.data));
};

3. 技术选型建议

场景推荐技术
简单状态检查短轮询
中等实时性要求长轮询
高实时性要求WebSocket
服务端推送SSE
双向通信WebSocket

安全与可靠性

1. 安全防护

  • 认证授权: 验证客户端身份

  • 速率限制: 防止滥用

  • 数据校验: 严格验证输入数据

2. 可靠性保障

  • 重试机制: 指数退避策略

  • 错误处理: 优雅降级

  • 监控报警: 实时监控系统状态


总结

轮询是一种基础的实时通信方式,短轮询简单但效率较低,长轮询优化了数据获取的实时性,但仍然受限于 HTTP 连接的开销。对于高频双向通信需求,WebSocket 通常是更好的选择。

选择何种方式,应根据具体应用需求、服务器资源和客户端环境进行权衡!

相关文章:

  • MySQL:建表,修改,删除
  • 再次认识虚拟地址空间 可执行程序的加载 ─── linux第21课
  • 极限网关六个企业级应用场景
  • 微信小程序状态管理与计算属性同时使用:miniprogram-computed 和 mobx-miniprogram
  • vcenter 虚机共享盘笔记
  • 锦华新材业绩波动明显:偿债能力偏弱,大额分红引关注
  • 20250320在荣品的PRO-RK3566开发板的buildroot系统下使用J27口的OTG0口接鼠标
  • AI社交的服务走向
  • 【力扣刷题实战】只出现一次的数字III
  • CVPR2025 | 蚂蚁浙大提出MP-GUI算法:全方位增强MLLM的GUI理解能力
  • VLAN的处理机制
  • 爬虫——playwright获取亚马逊数据
  • Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取
  • 服务器部署Kong和Konga过程
  • vue路由去掉#
  • 07. 面向对象高级(2)_设计模式
  • 基于ssm的在线点歌系统(全套)
  • 电源电路篇
  • python:AI+ music21 构建LSTM模型生成爵士风格音乐
  • Liunx安装elasaticsearch、ik分词器、kibana
  • 广西桂林、百色、河池等地表态:全力配合中央对蓝天立的审查调查
  • 浙江一教师被指殴打并威胁小学生,教育局通报涉事人被行拘
  • 贞丰古城:新垣旧梦间的商脉与烟火
  • 土耳其、美国、乌克兰三边会议开始
  • 媒体评欧阳娜娜遭民进党当局威胁:艺人表达国家认同是民族大义
  • 雷军内部演讲回应质疑:在不服输、打不倒方面,没人比我们更有耐心