一、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长轮询如何保证消息的绝对实时性相关推荐

  1. java 长轮询_基于springboot 长轮询的实现操作

    springboot 长轮询实现 基于 @EnableAsync , @Sync @SpringBootApplication @EnableAsync public class DemoApplic ...

  2. java定时轮询_RxJava应用场景之轮询定时任务

    Android开发中必不可少会遇到轮询或定时任务,在RxJava诞生之前,我们常常使用Handler+postDelay,或者Java中的Timer来实现,实际上RxJava也可以实现这类需求.下面, ...

  3. 长连接、短连接、短轮询、长轮询

    长连接.短连接.短轮询.长轮询 短连接:每次Http请求都会建立Tcp连接,管理容易 长连接:只需要建立一次Tcp连接,以后Http请求重复使用同一个Tcp连接,管理难 短轮询:重复发送Http请求, ...

  4. java线程轮询_基于springboot实现轮询线程自动执行任务

    本文使用: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行, 但不能在指定 ...

  5. 四年开发,待业半年本想放弃Java,抱着试试的心态面试某C轮金融科技公司居然过了!

    写在前面 个人背景: 开发4年,坐标杭州 金九银十已经过去了,写这篇文章的目的就是与大家谈谈面试方面的经验,心得,就个人方面而言,我之前做过的很多的工作都是面试造核弹,工作拧螺丝.但是不要因为自己是个 ...

  6. 【学习笔记】数据链路层——轮询访问介质控制(轮询协议、令牌传递协议)

    文章目录 一. 轮询访问介质控制 二. 轮询协议 三. 令牌传递协议 结束语 PPT截自王道考研B站教程 一. 轮询访问介质控制 结合了前面的信道划分访问控制.随机访问MAC协议的优点: 既要不产生冲 ...

  7. S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示

    S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示 我们在进行MODBUS通信轮询时,若遇到轮询卡死时,如何重新开始轮询,具体可以参考以下内容: 如下图所示,正常轮 ...

  8. 北醒发布长距固态激光雷达,完成B2轮融资 | CES 2019...

    激光雷达的火,在技术成熟.格局确定之前,还将继续烧下去,同时走向固态化已经成为行业的一大发展趋势. 1月8日,CES的第一天,北醒光子发布了最新的长距固态激光雷达『Benewake-Horn-X(角龙 ...

  9. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

最新文章

  1. 如何用Splunk建立可疑DNS报警系统
  2. Java动态追踪技术探究
  3. 差分约束 4416 FFF 团卧底的后宫
  4. el-table 树形表格 自定义展开图标_[shell脚本]表格数据在终端可视化输出
  5. 通货膨胀时是否提前还本付息--郎咸平
  6. 欧姆字符的编码c语言,《编码:隐匿在计算机软硬件背后的语言》读书笔记
  7. 打游戏学习人工智能!不写代码|湾区人工智能
  8. 迪士尼前高管凯文·梅耶尔加盟字节跳动,出任COO
  9. 漫谈广告竞价模式(五)
  10. 为什么Windows的兼容性这么强大,到底用了什么技术?
  11. matlab版K均值聚类
  12. mongodb 常用操作(转)
  13. GTK真不容易,资料少,学得人也少!
  14. 计算机二级的理论知识点,计算机二级必备知识点
  15. P3853 路标设置
  16. 计算机语言变成乱码怎么办,电脑文本文档出现乱码,教你电脑文本文档出现乱码怎么办...
  17. 如何做一名合格的部门经理
  18. IDEA编码小技巧(鼠标光标等等)
  19. ArcGIS Pro添加在线遥感底图
  20. 何为Root of Trust信任根?何为Chain of Trust信任链?

热门文章

  1. openEuler 知:repo
  2. 静态数码管显示数字及字母
  3. 时间管理软件 压力测试软件JMeter 微信小程序可视化代码生成 黑客网站
  4. python_与或非逻辑/真假值事例
  5. 基于JSP+MySQL的网上购书商城
  6. 前端开发小白,如何找一个师傅?
  7. 解决小程序api为http和豆瓣限制小程序使用api问题
  8. PostgreSQL PRIVILEGES(权限)
  9. VS连接Linux服务器
  10. 3.4. Transactions