java 实现http长轮询,webim使用http长轮询如何保证消息的绝对实时性
一、webim如何实现消息推送
webim通常有三种方式实现推送通道:
1)WebSocket
2)FlashSocket
3)http轮询
其中1)和2)是用Tcp长连接实现的,其消息的实时性很好理解,但这两种方案都存在一些局限性,不通用.
3)才算是webim实现消息推送的“正统”方案,用http短连接轮询的方式实现“伪长连接”,既然是轮询,有朋友就对消息的实时性产生了质疑。本文就是要解答,webim使用http长轮询如何保证消息的绝对实时性。
二、人们为什么会误解http长轮询不实时
什么是轮询?我擦,这个该怎么解释咧。
举个栗子,在火车上想上洗手间,挤到洗手间旁,却发现洗手间有人,于是你只能回座位继续等。过了N分钟,又朝洗手间的方向挤过去,却发现洗手间还是有人,又只能回坐等。这么一而再,再而三的每隔N分钟去洗手间查看洗手间是否有蹲位,这就是轮询。
webim用轮询的方式拉取消息会存在什么问题?
webim每隔N分钟,轮询调用 “获取消息”接口,有可能出现消息的延时,某一时刻刚拉取完消息,突然又产生了一条新消息,这条消息就必须等到N分钟之后,再次发起“获取消息”轮询时,才有机会获取到。
减小轮询时间间隔是否能解决消息延时的问题?
减小轮询时间间隔的确可以缩短延时时间,但也不能保证消息绝对的实时,同时又会产生新的副作用,绝大部分的轮询调用,都没有消息返回,造成服务端极大的资源浪费。
很多人基于上述直觉,认为webim使用http长轮询的方式拉取消息,会导致消息有延时,其实,webim的http长轮询根本不是这么玩的。
三、长轮询实际怎么玩
消息连接
webim和webserver之间建立一条http连接,专门用作消息通道,这条连接叫http消息连接【见下图】
消息连接的4大特性
1)没有消息到达的时候,这个http消息连接将被夯住,不返回,由于http是短连接,这个http消息连接最多被夯住90秒,就会被断开(这是浏览器或者webserver的行为)
2)在1)的情况下,如果http消息连接被断开,立马再发起一个http消息连接【见下图中的步骤1、2】
3)在1)和2)的配合下,浏览器与webserver之间将永远有一条消息连接在(极限情况下会出现情况4)),每次收到消息时,这个消息连接就能及时将消息带回浏览器页面,并且在返回后,会立马再发起一个http消息连接【见下图中的步骤1、2、3】
4)如果消息到达时,上一个http消息连接正在返回,没有http消息连接可用(理论上http消息连接的返回是瞬时的,没有连接可用出现的概率极小),则将消息暂存入消息池中,下一个消息连接到达后(上一个消息连接返回后,根据2)和3)会立马返回新的消息连接,无等待时间),将消息带回,并又立刻返回生成新的消息连接【见下图中的步骤1、2、3、4、5、6、7】
上述1-4就能够保证一直有一条http消息连接在,以保证webim消息推送的绝对实时性。
四、结论
webim通过http长轮询可以保证消息的绝对实时性。这种实时性的保证不是通过增加轮询频率来保证的,而是通过夯住http消息连接来保证的,在大部分时间没有实时消息的情况下,这个http消息连接对于webserver的请求压力是90秒1次,能够大大节省了web服务器资源。
java 实现http长轮询,webim使用http长轮询如何保证消息的绝对实时性相关推荐
- java 长轮询_基于springboot 长轮询的实现操作
springboot 长轮询实现 基于 @EnableAsync , @Sync @SpringBootApplication @EnableAsync public class DemoApplic ...
- java定时轮询_RxJava应用场景之轮询定时任务
Android开发中必不可少会遇到轮询或定时任务,在RxJava诞生之前,我们常常使用Handler+postDelay,或者Java中的Timer来实现,实际上RxJava也可以实现这类需求.下面, ...
- 长连接、短连接、短轮询、长轮询
长连接.短连接.短轮询.长轮询 短连接:每次Http请求都会建立Tcp连接,管理容易 长连接:只需要建立一次Tcp连接,以后Http请求重复使用同一个Tcp连接,管理难 短轮询:重复发送Http请求, ...
- java线程轮询_基于springboot实现轮询线程自动执行任务
本文使用: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行, 但不能在指定 ...
- 四年开发,待业半年本想放弃Java,抱着试试的心态面试某C轮金融科技公司居然过了!
写在前面 个人背景: 开发4年,坐标杭州 金九银十已经过去了,写这篇文章的目的就是与大家谈谈面试方面的经验,心得,就个人方面而言,我之前做过的很多的工作都是面试造核弹,工作拧螺丝.但是不要因为自己是个 ...
- 【学习笔记】数据链路层——轮询访问介质控制(轮询协议、令牌传递协议)
文章目录 一. 轮询访问介质控制 二. 轮询协议 三. 令牌传递协议 结束语 PPT截自王道考研B站教程 一. 轮询访问介质控制 结合了前面的信道划分访问控制.随机访问MAC协议的优点: 既要不产生冲 ...
- S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示
S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示 我们在进行MODBUS通信轮询时,若遇到轮询卡死时,如何重新开始轮询,具体可以参考以下内容: 如下图所示,正常轮 ...
- 北醒发布长距固态激光雷达,完成B2轮融资 | CES 2019...
激光雷达的火,在技术成熟.格局确定之前,还将继续烧下去,同时走向固态化已经成为行业的一大发展趋势. 1月8日,CES的第一天,北醒光子发布了最新的长距固态激光雷达『Benewake-Horn-X(角龙 ...
- 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列
唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...
最新文章
- 如何用Splunk建立可疑DNS报警系统
- Java动态追踪技术探究
- 差分约束 4416 FFF 团卧底的后宫
- el-table 树形表格 自定义展开图标_[shell脚本]表格数据在终端可视化输出
- 通货膨胀时是否提前还本付息--郎咸平
- 欧姆字符的编码c语言,《编码:隐匿在计算机软硬件背后的语言》读书笔记
- 打游戏学习人工智能!不写代码|湾区人工智能
- 迪士尼前高管凯文·梅耶尔加盟字节跳动,出任COO
- 漫谈广告竞价模式(五)
- 为什么Windows的兼容性这么强大,到底用了什么技术?
- matlab版K均值聚类
- mongodb 常用操作(转)
- GTK真不容易,资料少,学得人也少!
- 计算机二级的理论知识点,计算机二级必备知识点
- P3853 路标设置
- 计算机语言变成乱码怎么办,电脑文本文档出现乱码,教你电脑文本文档出现乱码怎么办...
- 如何做一名合格的部门经理
- IDEA编码小技巧(鼠标光标等等)
- ArcGIS Pro添加在线遥感底图
- 何为Root of Trust信任根?何为Chain of Trust信任链?