`

浅析轮询(Polling)和推送(Long-Polling)服务

    博客分类:
阅读更多
实时 Web 应用的窘境
Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事,但是对于那些实时要求比较高的应用来说,比如说在线游戏、在线证券、设备监控、新闻在线播报、RSS 订阅推送等等,当客户端浏览器准备呈现这些信息的时候,这些信息在服务器端可能已经过时了。所以保持客户端和服务器端的信息同步是实时 Web 应用的关键要素,对 Web 开发人员来说也是一个难题。在 WebSocket 规范出来之前,开发人员想实现这些实时的 Web 应用,不得不采用一些折衷的方案,其中最常用的就是轮询 (Polling) 和 Comet 技术,而 Comet 技术实际上是轮询技术的改进,又可细分为两种实现方式,一种是长轮询机制,一种称为流技术。下面我们简单介绍一下这几种技术:
轮询:
这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的最大问题是,当客户端以固定频率向服务器发起请求的时候,服务器端的数据可能并没有更新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。
轮询(Polling)是指不管服务器端有没有更新,客户端(通常是指浏览器)都定时的发送请求进行查询,轮询的结果可能是服务器端有新的更新过来,也可能什么也没有,只是返回个空的信息。不管结果如何,客户端处理完后到下一个定时时间点将继续下一轮的轮询。                                   
推送或叫长连接(Long-Polling)的服务其客户端是不做轮询的,客户端在发起一次请求后立即挂起,一直到服务器端有更新的时候,服务器才会主动推送信息到客户端。 在服务器端有更新并推送信息过来之前这个周期内,客户端不会有新的多余的请求发生,服务器端对此客户端也啥都不用干,只保留最基本的连接信息,一旦服务器有更新将推送给客户端,客户端将相应的做出处理,处理完后再重新发起下一轮请求。分为长轮询和流2种:
长轮询:
长轮询是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者时间过期,通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提高。
流:
流技术方案通常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进用户体验,同时这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。
举个例子说明下就很清楚了:

轮询模式,假设是客户端每2秒轮询一次,那么客户端每2秒就会发送一次请求,相应的服务器端每2秒就要响应这个客户端的一次请求。而实际上服务器端可能1秒钟后就有更新,也可能1分钟后才有更新。对于1秒钟就有更新的,客户端至少会有1秒钟的延时;而1分钟后才有更新的,只有最后一次查询有意义,这一分钟内的轮询其实都是没有必要的,服务器端和客户端均有资源的浪费。
推送模式,客户端发送一次请求后马上挂起等待服务器端响应,可能1秒,也可能10秒钟,也可能1分钟。如果服务器端是1秒就有更新,那么到1秒钟时客户端马上就收到更新了,如果是1分钟才有更新,那么整个一分钟客户端也只请求一次,服务器也只会相应一次,这个跟轮询的区别是不是已经很清楚了。
综合这几种方案,您会发现这些目前我们所使用的所谓的实时技术并不是真正的实时技术,它们只是在用 Ajax 方式来模拟实时的效果,在每次客户端和服务器端交互的时候都是一次 HTTP 的请求和应答的过程,而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量,而且这些方案中客户端和服务器端的编程实现都比较复杂,在实际的应用中,为了模拟比较真实的实时效果,开发人员往往需要构造两个 HTTP 连接来模拟客户端和服务器之间的双向通讯,一个连接用来处理客户端到服务器端的数据传输,一个连接用来处理服务器端到客户端的数据传输,这不可避免地增加了编程实现的复杂度,也增加了服务器端的负载,制约了应用系统的扩展性。
分享到:
评论

相关推荐

    浅析Comet技术在Java Web实时系统开发中的应用.docx

    Comet技术主要有两种实现方式:长轮询(Long-Polling)和流(Streaming)。 1. 长轮询:客户端发送请求到服务器,服务器保持连接开放,直到有新数据可用或达到预设的超时时才返回响应。客户端接收到响应后立即再次...

    浅析Comet技术在Java Web实时系统开发中的应用.pdf

    1. 长轮询(Long-polling):客户端发起请求,服务器接收到请求后并不立即响应,而是保持连接状态,直到有新的数据或达到超时时间才返回响应。客户端收到响应后会立即重新发起请求,保持连接的循环状态。长轮询的...

    Matlab中常见分布函数的拟合与KS检验:概率分布探索及应用

    内容概要:本文详细介绍了如何在Matlab中进行常见分布函数的拟合以及KS检验的方法。首先概述了多种常见的概率分布,如正态分布、对数正态分布、伽马分布等。接着,通过具体实例展示了如何使用Matlab内置函数fitdist进行分布拟合,并解释了拟合过程中参数的选择和调整。随后,文章讲解了KS检验的基本概念及其在Matlab中的实现方式,强调了KS检验在验证拟合效果中的重要性。最后,文章鼓励读者进一步探索其他类型的分布,指出不同分布在特定场景下的独特价值。 适合人群:对统计学有一定了解并希望通过Matlab工具深入研究数据分布特征的研究人员、学生和技术爱好者。 使用场景及目标:适用于需要对数据进行概率分布建模和验证的科研项目或数据分析任务。主要目标是帮助读者掌握Matlab环境下进行分布拟合和KS检验的具体操作步骤,提高对不同类型分布的理解和应用能力。 其他说明:文中提供了详细的代码片段作为示例,便于读者动手实践。同时,作者也提醒读者注意KS检验结果的解读,确保所选模型的有效性和合理性。

    Python示例源码-编写脚本从Unsplash下载随机图片并设置为壁纸-大作业.zip

    Python示例源码-编写脚本从Unsplash下载随机图片并设置为壁纸-大作业.zip

    基于FPGA的直方图统计与均衡算法:图像处理中的对比度增强技术实现 · FPGA 实用版

    内容概要:本文详细介绍了基于FPGA的直方图统计和直方图均衡算法的实现方法。直方图统计用于对图像进行有效的统计分析,而直方图均衡则是一种常见的图像对比度增强算法。文中不仅解释了这两个概念的基本原理,还提供了具体的算法公式和源码示例。特别强调了FPGA的并行计算能力和性能优化技巧,如流水线技术和多像素并行处理,以提升图像处理的速度和效率。此外,文章还展望了FPGA在未来图像处理领域的广泛应用前景,特别是结合深度学习和神经网络技术的可能性。 适合人群:从事图像处理、嵌入式系统开发的技术人员,尤其是对FPGA有一定了解的研究人员和工程师。 使用场景及目标:适用于需要深入了解FPGA在图像处理中的应用,特别是在直方图统计和直方图均衡方面的需求。目标是掌握这两种算法的具体实现方法和技术细节,以便应用于实际项目中。 其他说明:本文不仅提供了理论知识,还包括实用的代码示例,帮助读者更好地理解和实践FPGA在图像处理中的应用。

    基于PV-BUS结构的最小功率点跟踪研究.zip

    基于PV-BUS结构的最小功率点跟踪研究.zip

    MFCSocket编程专题知识讲座.pptx

    MFCSocket编程专题知识讲座.pptx

    Python示例源码-十进制与二进制互转转换器-大作业.zip

    Python示例源码-十进制与二进制互转转换器-大作业.zip

    excel表格的使用技巧.pptx

    excel表格的使用技巧.pptx

    Python源码-你好.zip

    Python源码-你好.zip

    哈工大CSAPP大作业

    哈工大CSAPP大作业

    阻尼比对串列双圆柱二自由度涡激振动及传热影响的数值研究.zip

    阻尼比对串列双圆柱二自由度涡激振动及传热影响的数值研究.zip

    模块化多关节绳驱动并联机器人设计.zip

    模块化多关节绳驱动并联机器人设计.zip

    能源管理领域:基于MATLAB的虚拟电厂鲁棒优化调度模型(含源荷双重不确定性) · 鲁棒优化

    内容概要:本文深入探讨了虚拟电厂(VPP)的日前鲁棒优化调度问题,特别是在源荷双重不确定性背景下。文中介绍了三个基于MATLAB的鲁棒优化调度模型,分别考虑了不同类型的不确定性因素。程序一主要关注虚拟电厂的日前经济调度,通过优化算法确定各个时间段内的燃气轮机出力、购电量、售电量及储能充放电功率等关键参数,以实现最佳经济效益。程序二和程序三在此基础上进一步引入了负荷和光伏的不确定性,提高了调度的鲁棒性和适应性。整个过程中,通过定义目标函数和设置多种约束条件,确保了模型的有效性和实用性。最终,借助MATLAB和CPLEX优化工具箱进行了仿真验证,展示了各机组的出力结果和储能分时电价调度情况。 适合人群:从事电力系统调度、能源管理及相关领域的研究人员和技术人员,尤其是对鲁棒优化方法感兴趣的学者。 使用场景及目标:适用于需要处理源荷双重不确定性的虚拟电厂日前经济调度场景,旨在提升电力系统的经济运行效率和能源利用率,确保调度决策的科学性和可靠性。 其他说明:本文不仅提供了详细的理论分析,还给出了具体的MATLAB代码实现,便于读者理解和实践。此外,文中引用了相关文献,有助于深入了解鲁棒优化模型的具体化简求解过程。

    Python源码-数据分析-【 项目:深圳市二手房房价分析及预测 】.zip

    Python源码-数据分析-【 项目:深圳市二手房房价分析及预测 】.zip

    Python示例源码-图像格式转换-大作业.zip

    Python示例源码-图像格式转换-大作业.zip

    大连华铁海兴MES 解决方案介绍.pdf

    大连华铁海兴MES 解决方案介绍.pdf

    Python示例源码-Instagram用户资料-大作业.zip

    Python示例源码-Instagram用户资料-大作业.zip

    松下FP-XH六轴控制系统:多工位转盘精准控制与故障处理

    内容概要:本文详细介绍了松下FP-XH六轴标准程序的设计与实现,涵盖点动控制、回零、相对定位、绝对定位等功能。程序采用分块编程方式,结构清晰,注释详尽,确保各轴协同运作精确无误。特别强调了多工位转盘循环控制的应用,以及完善的故障处理机制,如过热保护和柔性故障处理方法。此外,还提到了一些实用的功能,如调试模式和实时扭矩波形显示。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对多轴转盘控制有需求的专业人士。 使用场景及目标:适用于需要高精度多轴控制的工业应用场景,如生产线、加工中心等。目标是帮助工程师理解和应用松下FP-XH六轴控制系统,提高编程效率和设备运行稳定性。 其他说明:文中提供了具体的代码示例,展示了关键功能的实现细节,有助于读者更好地理解和实践。

    Python源码-跳板机连接mysql.zip

    Python源码-跳板机连接mysql.zip

Global site tag (gtag.js) - Google Analytics